0

NSFetchtedResultsController をプロパティとして指定しました...

@property (nonatomic, strong) NSFetchedResultsController *controller;

...そしてデリゲートを私のクラスに設定します。

self.controller.delegate = self;

次に、見出しに記載されているメソッドを実装し、ブレークポイントを配置しました。

    - (void)controller:(NSFetchedResultsController *)controller 
                didChangeObject:(id)anObject 
                atIndexPath:(NSIndexPath *)indexPath 
                forChangeType:(NSFetchedResultsChangeType)type 
                newIndexPath:(NSIndexPath *)newIndexPath 
    {    

    => BREAKPOINT <=

    }

次のように、コントローラーのフェッチ要求を作成しました。

  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Post"]; 
   // ... some sort ...
    self.controller = [[NSFetchedResultsController alloc]
                       initWithFetchRequest:fetchRequest
                       managedObjectContext:self.context
                       sectionNameKeyPath:nil
                       cacheName:@"cache"];

現在、同じコンテキストの別のクラスに「Post」タイプのいくつかの NSManagedObjects を格納していますが、didChangeObjectメソッドは呼び出されません(ブレークポイントがその中にあります)。

誰が何がうまくいかないのか知っていますか?

更新 #1: サーバーからいくつかの投稿を取得してコンテキストに格納するクラスは、GCD を使用して非同期で実行されます。

更新 #2: マルチスレッド環境でコンテキストを使用できないため、別の方法で試しました。(Thanks to svena) はServerConnection(GCD を使用して) 非同期ブロックで実行され、メイン スレッドでセレクターを実行します。このセレクター メソッドは投稿をデータベースに保存し、テーブルビューを更新する必要があります。基本的に、このコンテキストに何かを保存すると、didChangeObjectメソッドが自動的に呼び出されるべきだと思いましたか? しかし、そうではありません。:-/

現在のステータスを説明するために、短いシーケンス図を追加しました。 サンプル シーケンス図 これが機能しない理由を誰かが知っていますか? しばらくお待ちください。CoreData と Objective-C は初めてです。:)

4

1 に答える 1

1

更新 #1: サーバーからいくつかの投稿を取得してコンテキストに格納するクラスは、GCD を使用して非同期で実行されます。

この場合、GCD ブロックの管理対象オブジェクト コンテキストをどのように作成していますか? コンテキストもマネージド オブジェクトもスレッド セーフではなく、スレッド間で受け渡しできません。さらに、あるスレッドのコンテキストに加えられた変更は、他のスレッドのコンテキストに自動的に反映されません。iOS5 より前は、NSManagedObjectContextDidSaveNotification をリッスンし、NSFetchedResultsController インスタンスの mergeChangesFromContextDidSaveNotification: メソッドを使用してマージすることを意味します。

ちなみに素晴らしい図:)

次の箇所のコードを表示してください。

  1. コンテキストを作成する
  2. メインスレッドでブロックを実行してデータを挿入します
于 2012-05-27T15:35:03.360 に答える