该系统使用两个上下文的多线程Core Data配置,共享持久存储。
我在类型NSMainQueueConcurrencyType
(MOC A)的主线程上创建了一个MOC。有一位观察员为MOC A注册了NSManagedObjectContextObjectsDidChangeNotification
。
在其他地方,在队列中的后台线程上,创建类型为NSPrivateQueueConcurrencyType
的背景MOC(MOC B)并与MOC A共享相同的PersistentStoreCoordinator
。经过一些操作后,在MOC B上调用save
。
一个对象在后台MOC B上观察NSManagedObjectContextDidSaveNotification
s。通知后,它在主线程上调用MOC A上的mergeChangesFromContextDidSaveNotification
。
MOC B中新插入和更新的对象确实会导致MOC A上的观察者发生更改通知,但MOC B中的删除不会导致这些更改通知。对MOC A的获取确实反映出MOC B中的删除已传播到MOC A,但问题是没有更改通知。这是令人担忧的,因为视图和控制器可能认为已删除的对象仍然有效。
有关为什么会发生这种情况的任何猜测?
创建MOC A
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];`
创建MOC B
NSPersistentStoreCoordinator *psc = [[NSManagedObject managedObjectContext] persistentStoreCoordinator]; dispatch_async(_backgroundQueue, ^{ // create second MOC NSManagedObjectContext *bgMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; bgMoc.persistentStoreCoordinator = psc; bgMoc.undoManager = nil; [self registerForNotificationWithManagedObjectContext:bgMoc]; });
NSManagedObjectContextDidSaveNotification
- (void)managedObjectContextObjectsDidSaveNotification:(NSNotification *)notification { SEL selector = @selector(mergeChangesFromContextDidSaveNotification:); [[NSManagedObject managedObjectContext] performSelectorOnMainThread:selector withObject:notification waitUntilDone:YES]; }
编辑:我使用推荐的SO答案来合并两个MOC:https://stackoverflow.com/a/6959868/1505750