CoreData合并冲突显示托管对象版本更改而不是数据

时间:2016-09-15 09:52:52

标签: ios core-data nsmanagedobject nsmanagedobjectcontext merge-conflict-resolution

我在核心数据中有一个实体,我尝试从两个不同的上下文中更新它。我正在存储我需要更新的托管对象的managedObjectID,因为它是线程安全的。在更新我的对象之前,我刷新对象以避免合并冲突。这是我的代码:

context1.performBlock {
    let myObject = context1.objectWithID(managedObjectId)
    context1.refreshObject(myObject, mergeChanges: true)
    myObject.property1 = newValue
}

请注意,我还没有保存上下文,因为我想将这些更改作为与其他更新的交易的一部分提交。

对于同一个对象,我有一些其他属性需要立即提交,所以我为它创建了单独的上下文,以防止property1立即被提交。

context2.performBlock {
    let myObject = context2.objectWithID(managedObjectId)
    context2.refreshObject(myObject, mergeChanges: true)
    myObject.property2 = newValue
    do {
        try context2.save()
    }
    catch {}
}

在上面的代码中,在context2上,我更新了property2,它将立即提交给db,但在我的情况下这不是那么频繁的更新。在context1我经常更新property1(每1秒),我每10秒提交一次(注意每次更新property1时,我刷新对象,所以我会得到property2更新后context2的更新值。

大部分时间都可以正常工作,但有时我会遇到合并冲突。我不知道为什么每次刷新对象后我都会遇到合并冲突。

另外我的控制台向我显示除了托管对象版本之外的相同对象,所以如果所有属性都与版本更新的版本相同?

控制台日志:

  

错误域= NSCocoaErrorDomain代码= 133020"无法合并更改。"的UserInfo = {conflictList =(       " NSMergeConflict(0x17fa78f0)for NSManagedObject(0x18751830)with objectID' 0x170f1ca0' oldVersion = 8和newVersion = 9,旧对象快照= {\ n property1 = value1; \ n property2 = value2 \ n} ,新缓存行= {\ n property1 = value1; \ n property2 = value2 \ n} "   )}

如您所见,较旧的对象快照和新的缓存行具有相同的数据,但版本不同。

1 个答案:

答案 0 :(得分:0)

如@Husam在评论中所述,请尝试将MergePolicy上的ManagedObjectContext设置为:

 managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

希望获得帮助!