0

私はNSManagedObjectContext自分の中にapp delegateあり、データは正常にロードおよび保存されています。NSManagedObjectContextまた、マスター ビュー コントローラーから呼び出して、そこにデータをロードします。ただし、新しいデータが保存されたときにNSManagedObjectContext、マスタービューコントローラーで変更を検出してテーブルをリロードする方法がわからないため、問題があります。使用できると思いますが、アプリデリゲートのマスタービューコントローラーでNSNotification使用することは可能ですか?NSNotificationNSManagedObjectContext

コンテキストがアプリデリゲートからのものであるこのコードを実装しようとしましたNSManagedObjectContext(これは明らかに機能しません)。データの変化を検出する方法について何か提案はありますか?

[NSNotificationCenter defaultCenter]
     addObserver:self
        selector:@selector(handleDidSaveNotification:)
            name:NSManagedObjectContextDidSaveNotification
          object:context];

    if (![context save:&error]) {

        NSLog(@"there is a change");
    }
4

1 に答える 1

0

まず、ビュー コントローラーは、アプリ デリゲートによって作成された管理対象オブジェクト コンテキストを使用する必要があります (メイン スレッド用)。アプリ デリゲートが重要なデータの読み込みを行っている場合は、特にその目的のために、バックグラウンド スレッドで別のマネージド オブジェクト コンテキストを作成する必要があります。

可能であれば、View Controller はNSFetchedResultsControllerマネージド オブジェクト コンテキストからデータを取得するために使用する必要があります。表示が必要なデータのみを取得するための簡単なメカニズムを提供し、(ビュー コントローラーを FRC デリゲートにする場合) 管理対象オブジェクト コンテキストへの変更も監視し、テーブル ビューを再読み込みする必要があるときに通知します。

を使用できない場合NSFetchedResultsController、通知方法は正常に機能するはずです。上記のコードselfは、オブザーバーとして追加されます (これはビュー コントローラーであると想定しています)。ビューが読み込まれるときにこれを行うhandleDidSaveNotification:必要があり、テーブル ビューを再読み込みする必要があるときに呼び出されます。ビューがアンロードされたとき、およびビュー コントローラーの割り当てが解除されたときに、オブザーバーとして自分自身を削除することを忘れないでください。

あなたのコメントから、あなたは言います:

私はNSFetchedResultsControllerを使用し、このデータはテーブルにデータを入力する配列にロードされます

そうしないでください... を使用しNSFetchedResultsControllerてデータを取得しますが、配列にコピーしないでください。これにより、 の利点のほとんどが失われNSFetchedResultsControllerます。その代わり:

  1. 自分自身を のデリゲートにして、NSFetchedResultsController必要なのcontrollerDidChangeContent:は だけです[self.tableView reloadData];

  2. テーブル ビュー デリゲート メソッドtableView:cellForRowAtIndexPath:で、 を使用して、を使用NSFetchedResultsControllerしてセルにデータが表示されるオブジェクトを取得しますobjectAtIndexPath:

Ray Wenderlich のNSFetchedResultsControllerガイドはこちらからご覧ください。

于 2013-05-19T15:32:20.130 に答える