2013-02-04 8 views
17

親と同じデータを持つように子管理オブジェクトコンテキストを更新するにはどうすればよいですか?子管理オブジェクトコンテキストの内容は常に親の内容と同じですか?

私が知る限り、節約すると、子供は一歩、すなわち親に行くだけです。しかし、フェッチをフェッチするときは、常に親と永続ストアに至るまで完全に行きます。だから私は物事が同じになると思う。

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

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

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

ただし、親の一部の子供は古いデータを使用します。同じオブジェクトIDの同じデータ。どういうわけか、物件の価値は変わりません。

親から新鮮なデータを再読み込みするように子供に指示する方法を教えてください。

がより正確

言うPが親であることには

は、次にC1がデータを変更し、コミット子

としてC1 C2 C3を有していると言います。変更は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> 

ここでは、より包括的なバージョン理由ですmoc、親のmoc、blob、URL、およびオブジェクトIDを書き留めました。 子:

特に、mainqueue managedobjectコンテキストを他のすべてのmanagedObjectContextの親ではなく、親の別の子にします。一方、私はmainQueue Managedオブジェクトコンテキストにuptodate情報を持たせたい。私は標準的な解決策が何であるのだろうか。

+3

私は50の賞金を出して5票を得ました。私は10ポイント戻ってきました:) –

答えて

21

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

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

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

+0

リセットを使うのは本当に残念です。私は他の解決策を探しています。 –

+0

コンテキスト内の個々のmanagedObjectを更新するメソッドを追加しました。 –

+0

ブラボー:)私は実際にそれを使用しました。賞金をお楽しみください:)そして、なぜ、質問が下落したのか誰もが知っていますか? –

0

2011年および2012年のWWDCセッションビデオを含め、実際にこれを正しく行う方法に関する多くのドキュメントがあります。2012セッション214「コアデータのベストプラクティス」は特に興味深いでしょう。

たとえば、あなたの保存のために、それは次のようになります。子供が保存されます

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

、変更が親に行くと、あなたは親を節約 - にそれらの変更のすべてを正しく伝播ことになります他の子コンテクスト。あなたの質問を見ると、私はあなたの実装でいくつかの他の問題に遭遇する可能性があり、Session 214はそれらを解決する上で非常に役立つかもしれないと思います。

コンテキストをリセットする場合は、親子コンテキストを使用するときは、そのようにすることをお勧めしません。私はまたrefreshObject:mergeChanges:を使用することから遠ざけていきます。この目的のためにobjectWithIDを使用すると、管理オブジェクトコンテキストの行キャッシュを最大限に活用するため、多くの苦労を軽減できます。それはまた、要求を満足させるために、子供と両親の積み重ねを通るために必要な限り、たどり着くだけです。

+0

それはまさに問題です。私は、親を変更し、すべての子供を変更すると思った。 NO。 Fruity Geek氏によると、親からデータをリロードするための中核的なデータの練習は不安定です。どのコアデータが存在するかは、既存のデータが存在する場合、そのデータを使用することです。それが存在しないか、古いコアデータがより深く見える場合にのみ、 –

+1

[child performBlock]内で[parent performBlock]と呼ぶべきであることを示すために+1 –

+0

しかしフルーティオタクの答えがより正確です。それ以上の良い答えがない限り、私は彼を選ぶだろう、私は考えることができない。 –

関連する問題