3

這裏就是我想要做的事:崩潰正在重置NSPersistentStore而NSFetchedResultsController是跟蹤變更後

  1. 我使用NSFetchedResultsController來進行獲取和使用其委託
  2. 跟蹤更改我下載一些數據和根據某些情況下,我有時會刪除CoreData存儲的所有本地數據,方法是刪除NSPersistentStore並重新創建一個新數據。
  3. 我創建一個基於數據管理對象,並將其保存
  4. NSFetchedResultsController現在應該告訴我,我有一些變化

我得到的卻是試圖保存數據時,這個崩潰:

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. Object's persistent store is not reachable from this NSManagedObjectContext's coordinator with userInfo (null)

我總是使用一個NSManagedObjectContext,我總是讀&保存在主線程中。

看來,切換NSPersistenStore以某種方式混淆了獲取的結果控制器。這是預期的行爲還是我做錯了什麼?

回答

3

我不會推薦這種方法。我會用新的持久性商店創建一個新的MOC,並放棄舊的MOC。

我假設你在某個時候撥打-[ManagedObjectContext reset]?在執行此操作之前,您必須放棄所有來自該上下文的託管對象。他們都變得無效(這可能是你的崩潰的原因)。

你也應該看看How to force coredata to rebuild sqlite database model?

+0

嘗試重置以及;仍然沒有變化。我已經使用'removePersistentStore:error'' addPersistentStoreWithType:configuration:URL:options:error'刪除/添加了持久存儲。如果我需要重新創建MOC,那麼我認爲我也必須重新創建NSFetchedResultsController;我試圖避免這種情況,以減少應用程序中的耦合 – 2012-02-10 14:54:09

+0

是的,我相信移除NSFetchedResultsController將是解決方案的核心。我想不出通過調用所有數據(無需通過調用deleteObject:來更改通知)的方法,同時保留引用該數據的對象。 – 2012-02-10 16:10:49

+0

理論上,理論上,NSFetchedResultsController可以被MOC通知,一旦它的底層存儲消失了,結果集中的所有對象都被刪除了。不知道這是如何處理內部。 – 2012-02-10 16:33:26

2

我有同樣的崩潰。遵循Rob的建議,我每次撥打removePersistentStore:時都會發佈一個NSNotification,並且當發生這種情況時,所有擁有NSFetchedResultController的ViewController都會自動使其本地NSFetchedResultController無效。

即:

1 - 收聽NOTIFICATION:

-(id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
    // Custom initialization 
    [[NSNotificationCenter defaultCenter] addObserverForName:kNotificationDestroyAllNSFetchedResultsControllers object:nil queue:nil usingBlock:^(NSNotification *note) { 
     NSLog(@"[%@] must destroy my nsfetchedresultscontroller", [self class]); 
     [__fetchedResultsController release]; 
     __fetchedResultsController = nil; 
     }]; 
    } 
    return self; 
} 

2 - POST NOTIFICATION

for(NSPersistentStore* store in [self.persistentStoreCoordinator persistentStores]) 
{ 
    NSError *error; 
    NSURL *storeURL = store.URL; 
    [self.persistentStoreCoordinator removePersistentStore:store error:&error]; 
    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error]; 

    /** ... side effect: all NSFetchedResultsController's will now explode */ 
    [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationDestroyAllNSFetchedResultsControllers object:self]; 
} 
+0

hi @Adam,你的代碼不適合我 – Ranjit 2013-10-15 14:33:11

0

的NSFetchedResultsController監視改變在其相關的被管理對象的上下文對象因而它可能是監視過時的被管理對象上下文中對象的更改。

在重置NSPersistentStore後重新創建NSFetchedResultsController時,此問題得到解決

相關問題