如何观察是否从managedObjectContext中删除了NSManagedObject

我在应用程序中的某个位置(并加载另一个存储)从persistentStoreCoordinator中删除persistentStore并reset我的managedObjectContext。 当我这样做的时候,根据文档,我还需要删除所有被提取的managedObjects的引用:

所有接收者的被pipe理对象都被“遗忘”了。如果你使用这个方法,你应该确保你也放弃了对使用接收者获取的任何被pipe理对象的引用,
因为之后它们将会失效。

我想避免必须通过我所有的fetchedResultsControllers,caching,可能包含managedObjects的数组,也可以存储对象的详细视图等。

相反,我更喜欢观察被pipe理对象的isInserted状态是否改变。 就像是

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

不幸的是,这似乎并不奏效。

所以 – 我怎么能观察是否从managedObjectContext中删除了一个NSManagedObject?

使用NSNotificationCenter观察NSManagedObjectContextObjectsDidChangeNotification消息,然后检查NSManagedObjectContextObjectsDidChangeNotificationdeletedObjects方法。 有关详细信息,请参阅文档: https : //developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/occ/instm/NSManagedObjectContext/deletedObjects

我发现观察NSPersistentStoreCoordinatorStoresDidChangeNotification在我的情况下工作得很好。 它被称为两次 – 第一次,旧的持久性存储被删除,第二次时,新的商店被添加。

我仍然在testing这个解决scheme是否比尼古拉斯build议的更好。

没有内置通知或更改,你可以观察到,真正做你想要的。 但是build立你自己的很容易。 当你通过去除持久化存储和重置上下文的过程时,发布你自己的通知 – @"MyAppCoreDataExploded"或其他东西。 在任何使用pipe理对象的控制器中观察此通知。 当您收到该通知时,清理所有本地引用。