我在核心数据中有一个实体,我尝试从两个不同的上下文中更新它。我正在存储我需要更新的托管对象的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} " )}
如您所见,较旧的对象快照和新的缓存行具有相同的数据,但版本不同。
答案 0 :(得分:0)
如@Husam在评论中所述,请尝试将MergePolicy
上的ManagedObjectContext
设置为:
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
希望获得帮助!