为什么Core Data无法将数据从私有上下文合并到主上下文?

sta*_*low 7 core-data ios swift

我有一个使用Core Data的应用程序,具有以下相当标准的托管对象上下文层次结构:

Persistent Store Coordinator 
    ? Save Context (Private Queue Concurrency Type) 
        ? Main Context (Main Queue Concurrency Type)
        ? Private Context (Private Queue Concurrency Type)
Run Code Online (Sandbox Code Playgroud)

所有托管对象上下文的合并策略都设置为 NSMergeByPropertyObjectTrumpMergePolicy

我观察NSManagedObjectContextDidSaveNotification当保存私有上下文并将更改合并到主上下文时,将调用以下函数:

func contextDidSaveNotificationHandler(notification: NSNotification) {

    if let savedContext = notification.object as? NSManagedObjectContext {
        if savedContext == privateObjectContext {

            mainObjectContext.performBlock({

                if let updatedObjects = notification.userInfo![NSUpdatedObjectsKey] as? Set<NSManagedObject> {
                    //
                    // fire faults on the updated objects
                    //
                    for obj in updatedObjects {
                        mainObjectContext.objectWithID(obj.objectID).willAccessValueForKey(nil)
                    }
                }

                mainObjectContext.mergeChangesFromContextDidSaveNotification(notification)
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这大部分时间都在工作,但有时我发现私有上下文中对现有对象的更改未合并到主上下文中.我无法弄清楚为什么 - 私有上下文保存是成功的; 该NSManagedObjectContextDidSaveNotification通知正被发送; 正在调用通知处理程序; notification.userInfo?[NSUpdatedObjectsKey]包含正确更新的对象; 但最后,主要上下文与私有上下文不同步.(即:主上下文中的托管对象与包含的值不同步notification.userInfo?[NSUpdatedObjectsKey])如果我终止应用程序并重新启动它,则上下文会再次同步(从持久性存储加载对象之后).

-com.apple.CoreData.ConcurrencyDebug 1在启动参数中启用了,并且正在遵循所有Core Data多线程规则.我无法看到我的托管对象上下文层次结构或合并功能有任何明显错误.什么可能导致这个?

Dal*_*ale -1

问题在于您的合并策略。尝试更改为 NSErrorMergePolicy,我想您将开始看到合并冲突。至少这会让您更多地了解根本原因