2011-08-06 4 views
6

しばらくの間、「CoreDataはフォルトを達成できませんでした」というメッセージが表示されます。私たちはAppleのマニュアルを読んだが、何が保持されることが許されているかは不明である。私たちは、スレッドごとに1つのコンテキストを作成することに非常に注意しています。しかし、私たちのアプリケーションが行っていることの1つは、UIViewController(通常はNSArrayまたはNSDictionaryを介して)にNSManagedObjectsを保持していることです。私は、オブジェクトの関係が変化しており、適切な通知を処理していないということを推測しています。「CoreDataはフォルトを達成できませんでした」をどうやって防ぎますか?

誰もコアデータに関するより良いデザインに関する提案はありますか?エラーが発生したとき、実際にはコンテキストから何かを削除して障害が発生していることはわかりません。状態を保持している場合、私たちのUIViewController上でNSManagedObjectContextObjectsDidChangeNotificationを処理する必要がありますか?任意の提案をいただければ幸いです。

+1

NSManagedObjectsが削除された後の参照を持つビューがリリースされていませんでした。見つけにくいです。 – tjg184

答えて

5

コアデータに変更通知を登録することができます。これにより、管理対象オブジェクトが変更されたときに更新することができます。詳細については、Core Data Docsを参照してください。あなたが登録し、変化に対応する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]; 
} 
関連する問題