7

コア データに 1 対多のリレーションシップ b/w オブジェクトがあります。A==>>B(多くのオブジェクト) のように、A は B オブジェクトと 1 対多の関係にあります。私の質問は、A オブジェクトをフェッチすると、B オブジェクトもメモリに読み込まれるということですか? いいえの場合、いつロードされますか? リレーションシップにアクセスするときは?

4

1 に答える 1

6

ほとんどの場合、そうではありません。これは、コアデータの障害と呼ばれるメカニズムです。フレームワークは、まだ実現されていない(つまり、メモリにロードされている)オブジェクトを要求したときに、バックグラウンドで障害を実現します。

障害処理は透過的です。障害を実現するためにフェッチを実行する必要はありません。ある段階で障害オブジェクトの永続プロパティにアクセスすると、Core Dataはオブジェクトのデータを自動的に取得し、オブジェクトを初期化します(障害を発生させないメソッドのリストについては、NSManagedObjectクラスリファレンスを参照してください)。このプロセスは、一般に障害の発生と呼ばれます。たとえば、Departmentオブジェクトにその名前を取得するメッセージを送信すると、障害が発生します。この状況では、Core Dataがフェッチを実行して、オブジェクトのすべての属性を取得します。

したがって、あなたの例では、Aをロードすると、Core DataはBインスタンスに障害を発生させ(つまり、メモリにロードしない)、実際にBにアクセスしようとすると、障害を認識します(つまり、メモリにロードします)。

逆に、メモリにオブジェクトをロードしていて、それらを「アンロード」したい場合があります。これは、オブジェクトを障害に変えることと呼ばれます。

refreshObject:mergeChanges:メソッドを使用して、実現されたオブジェクトを障害に変えることができます。mergeChanges引数としてNOを渡す場合は、そのオブジェクトの関係に変更がないことを確認する必要があります。存在する場合は、コンテキストを保存すると、参照整合性の問題が永続ストアに発生します。

于 2013-02-27T12:58:16.720 に答える