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

我有一个使用NSManagedObjectContext设置的NSManagedObjectContext 。 我使用此上下文执行提取。

我也有一个使用相同的NSManagedObjectContext设置的NSBatchUpdateRequest 。 我使用相同的NSManagedObjectContext执行请求。

当我用NSBatchUpdateRequest执行请求时,我可以看到我所有的数据都已经更新了。 如果我重新启动应用程序,使用NSFetchedResultsController任何获取也正常工作。

这个问题是当我不重新启动应用程序,我做了一个又一个的操作,我得到了一个NSMergeConflict (0x17427a900) for NSManagedObject (0x1740d8d40) with objectID '0xd000000001b40000...错误,当我从我的上下文调用方法save

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

我该怎么办? 有两个不同的上下文? (怎么样?)

那么好像我可能已经find了如何去做,但如果你看到任何错误,请让我知道。

在进行批量更新时,您可以得到结果,无论是更新的行数还是已更新的对象ID列表。 你必须select最后一个。

一旦从上下文执行executeRequest ,您需要获取对象ID的列表,循环遍历所有这些对象,以获取每个NSManagedObject到Faults中,这要感谢上下文对象的方法objectWithID 。 如果您不知道Core Data中的Faults对象是什么,请参阅以下说明。

对于每个获得的NSManagedObject ,都需要使用其方法refreshObject刷新上下文。

一旦你这样做了,你需要再次执行你的fetchedResultsControllerperformFetch来回到批量更新之前的位置。

告诉我,如果我在哪里错了。

这里是代码:

 let batchUpdate = NSBatchUpdateRequest(entityName: "myEntity") batchUpdate.propertiesToUpdate = ["myPropertieToUpdate" : currency.amountToCompute] batchUpdate.affectedStores = managedContext.persistentStoreCoordinator?.persistentStores batchUpdate.resultType = .UpdatedObjectIDsResultType var batchError: NSError? let batchResult = managedContext.executeRequest(batchUpdate, error: &batchError) as NSBatchUpdateResult? if let result = batchResult { println("Records updated \((result.result as [NSManagedObjectID]).count)") // Extract Object IDs let objectIDs = result.result as [NSManagedObjectID] for objectID in objectIDs { // Turn Managed Objects into Faults let nsManagedObject: NSManagedObject = managedContext.objectWithID(objectID) if let managedObject = nsManagedObject as NSManagedObject? { managedContext.refreshObject(managedObject, mergeChanges: false) } } // Perform Fetch var error: NSError? = nil if !fetchedResultsController.performFetch(&error) { println("error: + \(error?.localizedDescription), \(error!.userInfo)") } } else { println("Could not update \(batchError), \(batchError!.userInfo)") } 

编辑 :这里有两个链接更多的解释:

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/