NSFetchedResultsController和NSBatchUpdateRequest等于NSMergeConflict。我做错了什么?

时间:2015-02-23 13:09:28

标签: ios objective-c swift core-data

我使用NSFetchedResultsController设置了NSManagedObjectContext。我使用这个上下文执行获取。

我还使用相同的NSBatchUpdateRequest设置NSManagedObjectContext。我使用相同的NSManagedObjectContext执行请求。

当我使用NSBatchUpdateRequest执行请求时,我可以看到我的所有数据都已更新。 如果我重新启动应用,则使用NSFetchedResultsController进行的任何提取都可以正常运行。

问题是当我没有重新启动应用程序并且我一个接一个地执行这两个操作时,当我从上下文调用方法NSMergeConflict (0x17427a900) for NSManagedObject (0x1740d8d40) with objectID '0xd000000001b40000...时出现save错误。

我知道问题来自同一数据的并发更改,但我不知道解决方案是什么?一个可能是通过NSMergePolicy课程,但我怀疑这是一个解决我问题的干净方法。

我该怎么办?有两种不同的背景? (工作原理)

1 个答案:

答案 0 :(得分:4)

好吧,好像我可能已经找到了怎么做,但是如果你看错了,请告诉我。

当您进行批量更新时,您可以获得结果,无论是什么,更新的行数或更新的对象ID列表。你必须选择最后一个。

从上下文中执行executeRequest后,您需要获取对象ID列表,遍历所有对象ID以使每个NSManagedObject进入故障,这要归功于方法objectWithID上下文对象。如果您不知道Core Data中的Faults对象是什么,here就是解释。

每获得NSManagedObject,您需要使用其方法refreshObject刷新上下文。

完成上述操作后,您需要再次执行performFetch的{​​{1}}以返回批量更新前的位置。

告诉我,我在某处是否错了。

以下是代码:

fetchedResultsController

修改: 以下是两个链接以获得更多解释:

http://code.tutsplus.com/tutorials/ios-8-core-data-and-batch-updates--cms-22164

http://www.bignerdranch.com/blog/new-in-core-data-and-ios-8-batch-updating/