17

親と同じデータを持つように子管理オブジェクト コンテキストを更新する方法は?

私の知る限り、貯蓄するとき、子供は一歩、つまり親にしか行きません。しかし、フェッチするとき、フェッチは常に親と永続ストアに至るまで非常に深くなります。だから私は物事が同じになることを期待しています。

しかし、そうではありません。

他のすべての管理対象オブジェクト コンテキストの親である管理対象オブジェクト コンテキストがあります。

1 人の子供がデータを変更して保存します。親も変わります。親で executeFetchRequest を実行すると、データが変更されていることがわかります。

ただし、一部の親の子はまだ古いデータを使用しています。同じオブジェクト ID 同じデータ。どういうわけか、プロパティの値は同じままです。

親から新しいデータをリロードするように子に指示する方法は?

より正確に言うと

P が親であるとします。

子として C1 C2 C3 があるとします

次に、C1 がデータを変更してコミットします。変更は P に伝搬されます。ただし、C2 と C3 で executeFetchRequest を実行すると、古いデータがまだ表示されます。

何を与える?

たとえば、imageBlob プロパティを確認すると、次のようになります。

子:

2013-02-05 13:57:42.865 BadgerNew[78801:c07] imageBlob: <UIImage: 0x89c3c50>
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null>
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null>
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null>

親:

2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114af650>
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x8e492e0>
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114c79b0>
2013-02-05 13:57:42.869 BadgerNew[78801:c07] imageBlob: <UIImage: 0xa8c76e0>

これは、モック、親モック、ブロブ、URL、およびオブジェクト ID を書き留めたより包括的なバージョンです。子:

特に、メインキューのマネージド オブジェクト コンテキストを、他のすべてのマネージド オブジェクト コンテキストの親ではなく、親の別の子にしたいと考えています。一方で、mainQueue マネージド オブジェクト コンテキストにも最新の情報が必要です。私は標準的な解決策が何であるか疑問に思います。

4

2 に答える 2

21

子には無効な既存の参照があります。親の保存後に兄弟を同期させたい場合は、 で子を無効にする必要がありますreset

を呼び出した後reset、受信側のすべての管理対象オブジェクトは「忘れられます」。このメソッドを使用する場合は、後で無効になるため、レシーバーを使用してフェッチされた管理対象オブジェクトへの参照も必ず破棄する必要があります。

refreshObject:mergeChanges:子コンテキストで変更されたオブジェクトをより細かく制御したい場合は、親コンテキストを保存するときに、すべての子コンテキストで変更された個々のオブジェクトで使用することもできます。

于 2013-02-08T06:20:54.110 に答える
0

2011 年と 2012 年の WWDC セッション ビデオなど、これを正しく行う方法については、実際には多くのドキュメントがあります。

たとえば、保存の場合は次のようになります。

 [child performBlock:^{
     [child save:&error];
     [parent performBlock:^{
         [parent save:&parentError];
     }];
 }];

これにより、子が保存され、変更が親に送られ、親に保存されます。これにより、これらの変更がすべて他の子コンテキストに正しく伝達されます。あなたの質問を見て、実装で他の問題に遭遇する可能性があると思います.Session 214はそれらを解決するのに非常に役立つかもしれません.

コンテキストのリセットに関しては、親子コンテキストを使用するときにそれを行うことはお勧めしません。また、 を使用しないようにしrefreshObject:mergeChanges:ます。この目的で objectWithID を使用すると、管理対象オブジェクト コンテキストの行キャッシュを最大限に活用できるため、多くの手間を省くことができます。また、要求を満たすために、子と親のスタックを必要な範囲だけトラバースします。

于 2013-02-12T20:08:05.353 に答える