我正在研究一些使用NSOperation
导入数据的代码。我希望用户能够撤消在导入操作期间创建的NSManagedObject
实例。取消在主线程中执行的核心数据插入
从我所知道的情况来看,对主线程执行的任何操作都不可能使用NSManagedObjectContext
-undoManager
。从使用核心数据编程指南节主题禁闭支持并发,我们有这两个条件:
- 只的objectID应通过托管对象上下文之间 (上 单独的线程)
- 被管对象 必须保存在 之前的上下文中才能使用objectID。
这是有道理的,因为管理对象需要从专用存储(NSManagedObjectContext
)公共存储(NSPersistentStore
),他们可以共享之前移动。
不幸的是,-save:
消息还会导致撤消堆栈中的任何托管对象被删除。从同样的引导件的存储器管理使用核心数据部分:
托管具有挂起 变化(插入,缺失,或 更新)可以通过上下文 被保留,直到它们的上下文中的对象被发送保存:, 重置,回滚或dealloc消息, 或相应数量的撤销到 撤消更改。
我已经试过几件事情要解决这一限制,一切最终导致恢复大部分工作都发生在主线程的(和纺纱沙滩球),以获得任何线索撤消通过创建关闭对象工作主线程将非常感激。
-
的增强雷达已经提交:rdar://problem/8977725
为什么不只是保留此操作插入的所有托管对象ID的日志?这样,如果用户想要回滚,可以简单地遍历并删除对象。如果您还必须回滚突变,那么记录关键/值更改也不难。看起来比试图将其放到撤销管理器中更简单。 – ImHuntingWabbits 2011-02-26 08:53:39
关于上述评论,你会如何提出重做? – wbyoung 2011-06-20 16:06:46