2009-05-23 11 views
6

私はコアデータアプリケーションを持っています。プロデューサスレッドでは、Webサービスからデータを取り出し、オブジェクトに保存してsaveを呼び出します。 私のコンシューマオブジェクトは、同じものを表示するテーブルビューコントローラです。セクション(ヌル)でコンソール上 プロデューサコアデータの消費者問題

削除

のためのオブジェクトを見つけることが期待される(:;:; 0xf46f40データ実体を:ID FeedEntry) ただし、アプリがクラッシュし、私は NSFetchedResultsControllerエラーを取得します。私がそれをデバッグすると、すべて正常に動作します。だから私はそれが競争の問題のようなものだと思った。

このような問題はどのように解決されますか?コアデータを使用してプロデューサ/コンシューマアプリケーションを設計する最良の方法は何ですか?

答えて

16

Leopard以降をターゲットにしている場合は、Appleが簡単に触れることができます。

プロデューサスレッドで、メインスレッドのMOCと同じPSCを持つMOCを作成します。このスレッド内のWebサービスからオブジェクトを取得し、新しいオブジェクトを作成し、通常どおりに保存することができます。

コンシューマスレッドでは、コントローラをNSManagedObjectContextDidSaveNotificationのオブザーバとして追加します。あなたのコールバックのようなものになります。このように

- (void) managedObjectContextDidSave:(NSNotification *)notification 
{ 
    NSManagedObjectContext *managedObjectContext = [notification object]; 
    if(managedObjectContext != self.managedObjectContext) 
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
} 

を、生産者スレッドに保存されたオブジェクトは、自動的に消費者のスレッドに引っ張られます。

+1

おかげで...あなたの答えは... は は、次のコードを追加し、NSManagedObjectContextDidSaveNotificationを購読するには、他人のために ...完璧だったsbooth \t \t [[NSNotificationCenter defaultCenter] addObserver:appDelegate \t \t \t \t \t \t \t \t \t \t \t \tセレクタ:@selector(managedObjectContextDidSave :) \t \t \t \t \t \t \t \t \t \t \t \t \t名:NSManagedObjectContextDidSaveNotification \t \t \t \t \t \t \t \t \t \t \t \tオブジェクト:自己。managedObjectContext]; – Mugunth

+2

@Mugunth Kumar、どのコンテキストをチェックしているのか、おそらくオブジェクトパラメータのために渡すべきではないので、アプリケーションのデリゲートのコンテキストではなくbgスレッド用に作成された新しいコンテキストを監視することはできません。 – marchinram

+0

まさに私が探していたもの。ありがとう。 – JHollanti

0

コアデータは一般にスレッドセーフではありません。私の好みは、バックグラウンドスレッドで最小限の作業を行い、コアデータエンティティを作成するために必要なデータをWebサービスから取得した後にメインスレッドに渡すことです。しかし、this documentを見てください。必要に応じて、スレッド間でコアデータを使用するための戦略がいくつかあります。

+0

"コアデータは一般的にスレッドセーフではありません"というのはむしろ誤解を招きます。各スレッド(または各操作;コンテキストはかなり軽量です)のコンテキストを作成する場合、コアデータフレームワークの残りの部分は、他のすべてを処理します(上記のようにNSManagedObjectContextDidSaveNotificationsを処理するだけで済みます)。 – hatfinch

+0

私は同意する、それは非常に誤解を招く。 – JHollanti