To-Manyリレーションシップで何が発生するか、親エンティティからのリレーションのウォークに依存するタイミング、および新しいフェッチリクエストを作成するタイミングに関連する、CoreDataの動作に関するいくつかの「理論」の質問があります。それらはすべて非常に関連しています。
バックグラウンド
RPBook
と多対関係にある親エンティティを想定しRPChapter
ます。本には多くの章があります。コアデータモデルでもその逆が設定されています。手動で順序付けられた関係の基本的な形式が含まれるため、RPChapter
エンティティにはchapterIndex
プロパティがあります。私はここでiOS5の新しい順序付けられた関係を使用していません(これらの質問にもそれほど関連していません)。
本の章にたどり着くには、chapters
リレーションシップアクセサーを使用します。
RPBook *myBook; // Assume this is already set to an existing RPBook
NSSet *myChapters = myBook.chapters
使用法/セットアップ
iPhoneアプリでは、RPBook
インスタンスのリストを表示するテーブルビューから始めます。対応するチャプターはまだ必要ないため、テーブルビューをサポートするフェッチされた結果コントローラーのフェッチ仕様の一部としてプリフェッチされません。
これらのインスタンスの1つを選択するRPBook
と、新しいページが表示され、ビューコントローラにこのインスタンス参照があります。これにはプリフェッチRPBook
されていません。chapters
質問1:すぐfilteredSetUsingPredicate:
に関係を呼び出すchapters
chapters
直接を使用してリレーションを介してフィルタリングしたい場合、私が見ている現在の関連するすべてのインスタンスをfilteredSetUsingPredicate:
プリフェッチしなかった場合、それは確実に機能しますか?言い換えれば、その関係にあるすべてのオブジェクトの舞台裏で障害を引き起こして、そのことを実行するのでしょうか、それとも、誤解を招くように、すでにメモリにあるチャプター(存在する場合)に基づいた結果しか得られないのでしょうか?RPChapter
RPBook
filteredSetUsingPredicate:
本に関連する章の数が非常に少ない場合は、代わりにallObjects
最初に呼び出してスタイルを設定する必要がありますか?すなわち
[[self.chapters allObjects] filteredArrayUsingPredicate:predicate]
ただの代わりに:
[self.chapters filteredSetUsingPredicate:predicate]
質問2:すべての本の章のバッチ検索
RPBook
インスタンスはあるが、それに関連するプリフェッチされたインスタンスがない場合、リレーションRPChapter
を使用して本のすべてのチャプターを一度にフェッチするようにするにはどうすればよいchapters
ですか?それを行うのですか[myBook.chapters allObjects]
、それともその呼び出しから障害を取り戻すことができますか?
上記の質問1のように、コアデータが、リレーションRPChapter
での使用の動作に影響を与えるかどうかを尋ねられた奇数のフォールトをトリップするのではなく、バッチですべてのフォールトを実行するようにします。filteredSetUsingPredicate:
chapters
これを行うには、明示的なフェッチ要求に頼る必要がありますか?すでに持っているものを再フェッチする必要がRPBook
ありますが、今回はフェッチリクエストで、関連するすべてのチャプターも使用してフェッチするようにリクエストしますsetRelationshipKeyPathsForPrefetching:
か?
この最後のオプションは私には無駄に思えます。b/c私はすでに、RPChapter
関心のあるすべてのインスタンスのサブセットを概念的に表すスコープ関係を持っています。可能な限り、オブジェクトグラフを歩きたいだけです。
質問3:同じスレッド上のRPChapterインスタンスのNSFetchedResultsController
セットアップ
この場合、RPBook
インスタンスはありますが、それに関連するプリフェッチされたRPChapter
インスタンスはありません(ただし、ストアには存在します)。同じViewControllerで、まったく同じ本にスコープされたインスタンスもありNSFetchedResultsController (FRC)
ます。RPChapter
つまり、同じスレッド、同じ管理対象オブジェクトコンテキストです。
FRCのインスタンスはRPChapter
、メモリ内で、同じオブジェクトを共有する、RPChapter
取得したインスタンスの対応物と同じオブジェクトになりますか?言い換えると、ランタイムは、メモリ内の異なる物理オブジェクトを使用して、同じスレッド内の同じMOCからの同じものに対する管理対象オブジェクトの要求を実行しますか?myBook.chapters
ObjectID
ObjectID
NSFetchedResultsController
質問4:リレーションのクエリを提供するために管理対象オブジェクト内にインストールするデザインパターン
chapters
カスタムRPChapter
管理対象オブジェクトサブクラスで提供される組み込みの関係を使用して、内容が頻繁に変更される関係(私の例では本の章)に関するクエリを処理できるかどうかを判断しようとしています。設計/アーキテクチャの観点から、インスタンスのを管理対象オブジェクトクラスにインストールしFRC
、RPChapter
そのRPBook
本の章に関するクエリを効率的に処理します。
chapters
たとえばアクセサーだけに頼ることができれば明らかにクリーンですがmyBook
、to-many関係に大量の宛先エンティティが存在する状況では、ここでのFRCの方が実際にはパフォーマンスと効率が高いようです。
これはやり過ぎですか、それともさまざまな方法でその章についてFRC
クエリを実行するためのフェアユースですか?RPBook
どういうわけか、オブジェクトグラフを単純に歩く機会を逃しているように感じます。インスタンスをロードするときに、リレーションが常に最新であると信頼できるようにしたいと思います。chapters
RPBook