CoreData merge conflict shows managed object version change not data

时光怂恿深爱的人放手 提交于 2020-12-26 07:19:17

问题


I am have an entity in core data and I try to update it from two different context. I am storing managedObjectID of my managed object which I need to update as it is thread safe. Before updating my object I refresh the object to avoid merge conflict. Here is my code:

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

Notice that I haven't saved the context here, as I want to commit these changes as part of transaction with other updates.

For the same object I have some other properties which I need to commit straight away, so I create separate context for that to prevent property1 to get committed immediately.

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

In above code, on context2, I have updated property2, which will be committed to db immediately but this is not so frequent update in my case. On context1 I am updating property1 frequently (in every1 sec), and I commit it in every 10 seconds (notice that every time I update property1, I refresh object, so I will get updated value of property2 once changed by context2).

This works fine for most of the time, but some times I get merge conflict. I don't know why I am getting merge conflict even after refreshing object every time.

Also my console shows me same object except version of managed object, so if all properties are same than how version got updated?

Console log:

Error Domain=NSCocoaErrorDomain Code=133020 "Could not merge changes." UserInfo={conflictList=( "NSMergeConflict (0x17fa78f0) for NSManagedObject (0x18751830) with objectID '0x170f1ca0' with oldVersion = 8 and newVersion = 9 and old object snapshot = {\n property1 = value1;\n property2 = value2\n} and new cached row = {\n property1 = value1;\n property2 = value2\n}" )}

As you can see, older object snapshot and new cached row has same data, but version is different.


回答1:


As mentioned by @Husam in comment, try to set MergePolicy on ManagedObjectContext as:

 managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

Hope this help!



来源:https://stackoverflow.com/questions/39508077/coredata-merge-conflict-shows-managed-object-version-change-not-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!