2013-08-24 66 views
1

我在我的應用程序(和加載另一個存儲)中的某個位置從persistentStoreCoordinator中刪除persistentStore,我的managedObjectContext爲reset。 當我做到這一點,根據該文件,我還需要刪除已取到managedObjects所有引用:如何觀察是否從managedObjectContext中刪除了一個NSManagedObject

所有接收方的管理對象是「被遺忘的」如果使用此 方法,你應該 確保您還放棄對使用接收方提取的任何託管對象的引用,因爲這些對象之後將無效。

我想避免不必經過我所有的fetchedResultsControllers,高速緩存,陣列可能包含managedObjects,詳細視圖也存儲物體等

相反,我寧願去觀察,如果管理對象的isInserted狀態更改。類似於

[myObject addObserver:self 
      forKeyPath:@"isInserted" 
       options:0 
       context:nil]; 

不幸的是,這似乎並不奏效。

所以 - 如何觀察是否從managedObjectContext中刪除了NSManagedObject?

+0

如果有這樣的通知,你會做什麼迴應?你仍然需要瀏覽所有提取的結果控制器等,並將其清除。重置託管對象上下文對您的數據模型是一個重大沖擊,觸及模型的所有內容都需要以某種方式作出響應。 –

+0

好吧,我會在擁有一個管理對象的每個控制器上得到這個通知。所以我不必手動通過控制器層次結構,而是每個控制器都可以獨立作出反應。這似乎更可靠。 –

回答

0

我發現觀察NSPersistentStoreCoordinatorStoresDidChangeNotification在我的情況下工作得很好。 它被調用兩次 - 第一次,舊的持久性存儲被刪除,第二次添加新的商店時。

我還在測試這個解決方案是否比尼古拉斯建議的更好。

3

使用NSNotificationCenter觀察NSManagedObjectContextObjectsDidChangeNotification消息,然後檢查您的NSManagedObjectContextdeletedObjects方法。請參閱文檔的詳細信息:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/occ/instm/NSManagedObjectContext/deletedObjects

+0

'deletedObjects'實際上是零。但是,通知包含密鑰「NSInvalidatedAllObjectsKey」,這是合理的,因爲對象並沒有被刪除但是無效。 –

+0

用於提及核心數據發送的通知。 –

0

沒有內置的通知或更改,你可以觀察到真正做到了你想要的。但建立你自己的很容易。當您完成刪除永久存儲並重置上下文的過程時,請發佈您自己的通知 - @"MyAppCoreDataExploded"或其他東西。在任何使用管理對象的控制器中觀察此通知。當您收到該通知時,清理所有本地引用。