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

时间:2014-06-27 00:02:14

标签: ios core-data nsmanagedobjectcontext

该系统使用两个上下文的多线程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

0 个答案:

没有答案