我正在编写一些使用NSOperation
导入数据。我希望用户能够撤消NSManagedObject
在导入操作期间创建的实例。
据我所知,不可能使用NSManagedObjectContext
-undoManager
对于在主线程之外执行的任何操作。来自核心数据编程指南部分关于使用线程限制来支持并发,我们有这两个条件:
- 仅应传递 objectID
托管对象上下文之间(在
单独的线程)
- 管理对象
必须先保存在上下文中
可以使用objectID。
这是有道理的,因为管理对象需要从私有存储中移动(NSManagedObjectContext
)到公共存储(NSPersistentStore
),然后才能共享。
不幸的是,-save:
消息还会导致撤消堆栈中的任何托管对象被删除。来自使用核心数据的内存管理同一指南的部分:
已挂起的托管对象
更改(插入、删除或
更新)由其上下文保留
直到他们的上下文被发送保存:,
重置、回滚或解除分配消息,
或适当的撤消次数
撤消更改。
我已经尝试了几种方法来解决这个限制,并且一切最终都会导致主线程上发生的大量工作(以及旋转的沙滩球)。任何与主线程创建的对象进行撤消工作的线索都将是非常重要的非常感激。
--
增强型雷达已提交:rdar://问题/8977725 http://www.openradar.me/8977725
这个答案可能会有点来回。如果我正确理解问题,您正在执行导入,但是导入完成后您希望用户能够选择从导入中保存的内容?
如果这是不正确的,请修正我的假设,我将更新这个答案。
如果它是正确的那么你可以做的是:
-
将背景对象创建更改为
NSEntityDescription *myEntity = ... //Entity from your context
[[NSManagedObject alloc] initWithEntity:myEntity
insertIntoManagedObjectContext:nil];
- 将这些实体存储在数组中。
- 根据需要将实体传递回主线程。
- 释放您不想保留的任何对象
- Call
[myMainContext insertObject:managedObject]
任何您想保留的内容。
- 执行保存
NSManagedObjectContext
.
由于这些实体不属于NSManagedObjectContext
但它们只存在于记忆中should是线程安全的,因为它们还没有绑定到NSManagedObjectContext
.
这当然是理论上的,需要测试。然而它应该实现你的目标。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)