Core data 当一个上下文保存对象更新,而另一个上下文删除对象时,解决RestKit中的CoreData合并冲突

Core data 当一个上下文保存对象更新,而另一个上下文删除对象时,解决RestKit中的CoreData合并冲突,core-data,concurrency,merge,restkit,nsmanagedobjectcontext,Core Data,Concurrency,Merge,Restkit,Nsmanagedobjectcontext,假设我有一个名为«图片»的NSManagedObject,它是我通过RestKit创建的。 我正在通过一个操作上传实际的图片文件内容。该操作正在跟踪上载进度,并将其保存在图片对象的«进度»属性中 if(![self isCancelled]) { Picture *pic = [Picture findFirstByAttribute:@"pictureId" withValue:self.pictureId]; if(![pic isDeleted]) { pi

假设我有一个名为«图片»的NSManagedObject,它是我通过RestKit创建的。 我正在通过一个操作上传实际的图片文件内容。该操作正在跟踪上载进度,并将其保存在图片对象的«进度»属性中

if(![self isCancelled]) {
    Picture *pic = [Picture findFirstByAttribute:@"pictureId" withValue:self.pictureId];
    if(![pic isDeleted]) {
        pic.progress = [NSNumber numberWithFloat:progress];
        [[RKObjectManager sharedManager].objectStore save:NULL];
    }
}
我的视图控制器在NSFetchedResultsController的帮助下显示图片对象列表。 上传效果很好,RestKit正在执行线程安全,并将其合并回主NSManagedObjectContext,因此UI将按预期显示上传进度

现在想象一下,在上传图片时,用户按下«取消»十字,这也应该删除图片对象。 在控制器中,我在NSOperation上调用cancel,这将在毫秒内有效地停止运行该操作,并且该对象将从主线程上的CoreData中删除

[uploadOperation cancel];
Picture *pic = [Picture findFirstByAttribute:@"pictureId" withValue:self.pictureId];
[pic deleteEntity];
[[RKObjectManager sharedManager].objectStore save:NULL];
跟踪显示,我在NSFetchedResultsControllerDelegate上获得了预期的NSFetchedResultsChangeDelete。但是,紧接着是NSFetchedResultsChangeInsert和NSFetchedResultsChangeUpdate,因为保存进度的操作非常频繁。 NSOperation使用的NSManagedObjectContext似乎不同步。它不知道图片对象被删除,调用save:会导致插入和更新

因此,在我的UI(和DB)中,我的图片对象在应该删除的时候仍然保留

查看RKManagedObjectStore,似乎合并是从后台线程(NSOperation)到主线程(my view controller),但不是相反的方式


解决此问题的最佳方法是什么?

听起来是使用核心数据撤消管理器的最佳情况。您可以在Apple提供的CoreDataBooks示例中找到一个很好的示例。

听起来是使用Core Data Undo Manager的最佳情况。你可以在苹果提供的CoreDataBooks示例中找到一个很好的例子。

我认为你应该稍微改变一下应用程序的控制流程。在操作仍在进行时删除主上下文中的对象听起来是个坏主意。例如,您为什么不在
NSOperation
本身中检查操作是否已取消,并使用其MOC从中删除图像对象?这样的话,你只能在一个孩子的MOC上写文章。另一种方法是,在每次修改之前更新操作中的子MOC,这会破坏具有单独上下文的目的


仔细想想,可能有一些聪明的方法可以观察
nsmanagedObjectContextObjectsIDChangeNotification
,并与适当的
NSMergePolicy
合并,但是,我认为这对于您的案例来说太过分了。我只需要在同一个地方处理整个取消和删除操作。

我认为您可能应该稍微更改应用程序的控制流程。在操作仍在进行时删除主上下文中的对象听起来是个坏主意。例如,您为什么不在
NSOperation
本身中检查操作是否已取消,并使用其MOC从中删除图像对象?这样的话,你只能在一个孩子的MOC上写文章。另一种方法是,在每次修改之前更新操作中的子MOC,这会破坏具有单独上下文的目的

仔细想想,可能有一些聪明的方法可以观察
nsmanagedObjectContextObjectsIDChangeNotification
,并与适当的
NSMergePolicy
合并,但是,我认为这对于您的案例来说太过分了。我会在同一个地方处理整个取消和删除。

这里是“死链接”这里是“死链接”