Ios 调用mergeChangesFromContextDidSaveNotification:未在主上下文中触发mocObjectsDidChangeNotification

Ios 调用mergeChangesFromContextDidSaveNotification:未在主上下文中触发mocObjectsDidChangeNotification,ios,core-data,nsmanagedobjectcontext,Ios,Core Data,Nsmanagedobjectcontext,本系统采用多线程核心数据配置两个上下文,共享持久存储 我在类型为NSMainQueueConcurrencyType(MOC A)的主线程上创建了一个MOC。有一个观察员已为MOC A的NSManagedObjectContextObjectsIDChangeNotification注册 在别处,在队列中的后台线程上,创建类型为NSPrivateQueueConcurrencyType的后台MOC(MOC B),并与MOC a共享相同的PersistentStoreCoordinator。在一些

本系统采用多线程核心数据配置两个上下文,共享持久存储

我在类型为
NSMainQueueConcurrencyType
(MOC A)的主线程上创建了一个MOC。有一个观察员已为MOC A的NSManagedObjectContextObjectsIDChangeNotification注册

在别处,在队列中的后台线程上,创建类型为
NSPrivateQueueConcurrencyType
的后台MOC(MOC B),并与MOC a共享相同的
PersistentStoreCoordinator
。在一些操作之后,在MOC B上调用
save

一个对象正在后台MOC B上观察
NSManagedObjectContextDidSaveNotification
s。收到通知后,它调用主线程a
mergeChangesFromContextDidSaveNotification

MOC B中新插入和更新的对象确实会导致MOC A上的观察者收到更改通知,但MOC B中的删除不会导致这些更改通知。MOC A上的获取确实反映了MOC B中的删除已传播到MOC A,但问题是没有更改通知。这是令人担忧的,因为视图和控制器可能认为删除的对象仍然有效

猜猜为什么会这样

创建主运行中心A

    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];`
创建主运行中心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]; });
编辑:我使用推荐的SO答案从这里合并了两个主运行中心:

我目前遇到了同样的问题。这方面有进展吗? - (void)managedObjectContextObjectsDidSaveNotification:(NSNotification *)notification { SEL selector = @selector(mergeChangesFromContextDidSaveNotification:); [[NSManagedObject managedObjectContext] performSelectorOnMainThread:selector withObject:notification waitUntilDone:YES]; }