3

メインスレッドにNSFetchedResultsControllerがあります。また、メインスレッドから、私は非同期にJSONのネットワークリクエストを送信します。そのJSON文字列が返ってくると、新しい(背景)NSManagedObjectContextを挿入し、JSON文字列を解析し、NSManagedObjectを作成してコンテキストに保存するNSOperationを開始します。バックグラウンドコンテキストは、メインコンテキストと同じpersistentStoreを持ちます。私は任意の(任意のスレッド上の)任意のコンテキストから、永続ストアに保存されますが、変更がありますが、これまでのところ、それは選択しないことが主なNSFetchedResultsControllerに通知するだろうと思っメインスレッドでNSFe​​tchedResultsControllerを無視すると、別のスレッドからCore Dataに保存されますか?

  1. :これで、私は2つの質問を持っています変更を取り消すメインスレッドのNSFetchedResultsControllerに外部saveがあることを通知するために何かする必要があるので、それに応じてtableViewが更新されますか?

  2. ので、メインスレッド上で、私はNSManagedObjectContextWillSaveNotificationに加入し、(別のスレッドに完全に既存のものを含む)すべてのコンテキストがsave操作を実行するときに正しく表示されます。 apple docsは、notification.userInfoに、バックグラウンドスレッド上の「更新された、削除された、挿入された」モデルオブジェクトのそれぞれに対して3つの配列、1つの配列の辞書が必要であると言う。ただし、私にとってuserInfoは常にnilです。私が間違っていることは何ですか?

    AppDelegateでNSManagedObjectContextWillSaveNotificationへの登録

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(managedObjectContextDidSave:) 
              name:NSManagedObjectContextWillSaveNotification 
              object:nil]; 

や状況がAppDelegate内に保存されているときのための方法:

- (void)managedObjectContextDidSave:(NSNotification *)notification { 
    DLog(@"notification: %@", notification); //not nil 
    DLog(@"notification user info: %@", notification.userInfo); // always nil... why?? 

    NSManagedObjectContext *theContext = notification.object; 
    if(theContext != context) { 
     DLog(@"---- SAVED ON ANOTHER CONTEXT"); 

     // should I notify NSFetchedResultsController that there were context saves on background threads? 
     // how can I merge contexts if userInfo is nil? 
    } 
} 

私ものベストプラクティスを知りたいのですが複数のスレッド(別々のNSManagedObjectContextを持つ)とコアデータを扱います。

答えて

5

あなたは間違った通知を受けます:あなたが観察する必要がある通知の名前はNSManagedObjectContextDidSaveNotification(ではないNSManagedObjectContextWillSaveNotification)です。

+0

素晴らしい! userInfoは正しい辞書で埋められるようになりました。 'NSFetchedResultsController'に変更について通知するのはどうですか?これらの変更をメインコンテキストにマージすることをお勧めしますか?NSFetchedResultsControllerを更新する簡単な方法はありますか? – johngraham

+3

コントローラはメインのコンテキストに依存しているため、これを行う正しい方法(実際には唯一の方法)は、変更をそのコンテキストにマージすることです。 – paulbailey

+2

はい、 ' - [NSManagedObjectContext mergeChangesFromContextDidSaveNotification:]'を使って変更をマージするようにメインコンテキストに指示する必要があります。 'NSFetchedResultController'にデリゲートがあれば自動的に内容を更新し、デリゲートへの変更を通知します。それ以外の場合は、 'performFetch:'を送信してコンテンツをリロードすることができます。 –

関連する問題