【发布时间】:2011-06-23 20:46:38
【问题描述】:
我正在编写一些使用NSOperation 导入数据的代码。我希望用户能够撤消在导入操作期间创建的 NSManagedObject 实例。
据我所知,在主线程之外执行的任何操作都无法使用 NSManagedObjectContext -undoManager。从核心数据编程指南部分使用线程限制支持并发,我们有这两个条件:
- 只应传递 objectID 托管对象上下文之间(在 单独的线程)
- 托管对象 必须先保存在上下文中 可以使用 objectID。
这是有道理的,因为托管对象需要从私有存储 (NSManagedObjectContext) 移动到公共存储 (NSPersistentStore) 才能共享。
不幸的是,-save: 消息还会导致撤消堆栈中的所有托管对象被删除。从同一指南的使用核心数据进行内存管理部分:
有待处理的托管对象 更改(插入、删除或 更新)由其上下文保留 直到他们的上下文被发送一个保存:, 重置、回滚或释放消息, 或适当数量的撤消 撤消更改。
我已经尝试了几种方法来解决这个限制,但一切最终都会导致主线程上发生的大部分工作(以及旋转的沙滩球)。任何关于撤消使用主线程创建的对象的线索将不胜感激。
--
已提交增强雷达:rdar://problem/8977725
【问题讨论】:
-
为什么不记录这个操作插入的所有托管对象 ID 的日志呢?这样,如果用户想要回滚它,您可以简单地迭代并删除对象。如果您还必须回滚突变,那么记录键/值更改也不会太难。似乎比尝试将其插入撤消管理器更简单。
-
关于上述评论,您建议如何处理重做?
标签: objective-c cocoa core-data nsoperation nsmanagedobjectcontext