6

「CoreData は障害を実行できませんでした」というメッセージが時々表示されます。Apple のドキュメントを読みましたが、何を保持できるかが不明です。スレッドごとに 1 つのコンテキストを作成するなど、細心の注意を払ってきました。ただし、アプリで行っていることの 1 つは、UIViewControllers に NSManagedObjects を保持することです (通常は NSArray または NSDictionary を介して)。オブジェクトの関係が変化しており、適切な通知を処理していないことが原因だと思います。

Core Data に関して、より良い設計について何か提案はありますか? エラーが発生したとき、コンテキストから実際に何かを削除して障害を引き起こしたことはわかりません。状態を保持している場合、UIViewControllers で NSManagedObjectContextObjectsDidChangeNotification を処理する必要がありますか? 任意の提案をいただければ幸いです。

4

1 に答える 1

5

Core Data で変更通知を登録できます。これにより、管理対象オブジェクトが変更されたときに更新できます。詳細については、コア データ ドキュメントを参照してください。登録して変更に対応する 2 つの方法に興味があるでしょう。

  [NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(mergeChanges:)
                                              name:NSManagedObjectContextDidSaveNotification
                                            object:(your NSManagedObjectContext)];

mergeChanges セレクター (メソッド) は、次のメソッドを呼び出して、他のスレッドからの変更を同期します。次のようになります。

- (void)mergeChanges:(NSNotification *)notification{
  AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
  NSManagedObjectContext *context = [appDelegate managedObjectContext];

  // Merge changes into the default context on the main thread
  [context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                            withObject:notification
                         waitUntilDone:YES];  
}
于 2011-08-10T14:30:39.517 に答える