撤消从主线程执行的核心数据插入

cho*_*rry 15 cocoa core-data objective-c nsoperation nsmanagedobjectcontext

我正在研究一些使用NSOperation导入数据的代码.我希望用户能够撤消NSManagedObject导入操作期间创建的实例.

据我所知,NSManagedObjectContext -undoManager对于从主线程执行的任何操作都是不可能的.从" 使用线程限制到支持并发"的" 核心数据编程指南"部分,我们有以下两个条件:

  1. 应该在托管对象上下文之间传递objectID(在不同的线程上)
  2. 在使用objectID之前,必须将托管对象保存在上下文中.

这是有道理的,因为托管对象需要在共享之前从私有存储(NSManagedObjectContext)移动到公共存储(NSPersistentStore).

不幸的是,该-save:消息还会导致撤消堆栈中的任何托管对象被删除.从同一指南的 内存管理使用核心数据部分:

具有挂起更改(插入,删除或更新)的托管对象将由其上下文保留,直到其上下文发送save:,reset,rollback或dealloc消息,或者相应数量的撤消以撤消更改.

我已经尝试了几个方法来解决这个限制,一切最终都会导致主要线程上发生的大量工作(以及旋转的沙滩球.)任何使用撤消处理主线程创建的对象的线索都会非常非常感激.

-

已提交增强型雷达:rdar:// problem/8977725

Bra*_*rad 0

不是专家,但我认为您需要做的是创建第二个上下文来执行操作,然后将两个上下文合并在一起。您应该能够将合并作为撤消步骤进行管理。请注意,仅当您将整组操作视为一个撤消步骤(就用户而言)时,这才有效。