objective-c – 撤销主线程执行的Core Data插入

objective-c – 撤销主线程执行的Core Data插入,第1张

概述我正在使用一些使用NSOperation导入数据的代码.我希望用户能够撤销在导入 *** 作期间创建的NSManagedObject实例. 从我可以看出,对于从主线程执行的任何 *** 作,不可能使用NSManagedObjectContext -undoManager.从使用线程限制支持并发的核心数据编程指南部分,我们有以下两个条件: Only objectID should be passed between 我正在使用一些使用NSOperation导入数据的代码.我希望用户能够撤销在导入 *** 作期间创建的NSManagedobject实例.

从我可以看出,对于从主线程执行的任何 *** 作,不可能使用NSManagedobjectContext -undoManager.从使用线程限制支持并发的核心数据编程指南部分,我们有以下两个条件:

Only objectID should be passed
between managed object contexts (on
separate threads) Managed objects
must be saved in a context before
the objectID can be used.

这是有道理的,因为托管对象需要从私有存储(NSManagedobjectContext)移动到公共存储(NSPersistentStore)才能被共享.

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

Managed objects that have pending
changes (insertions,deletions,or
updates) are retained by their context
until their context is sent a save:,
reset,rollback,or dealloc message,
or the appropriate number of undos to
undo the change.

我已经尝试了几件事情来解决这个限制,所有的东西最终都会导致主线程(和旋转海滩球)发生的大部分工作.对于从主线程创建的对象来解除处理的任何线索将是非常非常感激.

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

解决方法 这个答案可能会有一点来回.如果我正确地了解问题,您正在进行导入,但是当导入完成后,您希望用户能够从导入中选择保存的内容?

如果这是不正确的,请修正我的假设,我会更新这个答案.

如果是正确的,那么你可以做的是:

>将您的背景对象创建更改为

NSEntityDescription *myEntity = ... //Entity from your context[[NSManagedobject alloc] initWithEntity:myEntity         insertIntoManagedobjectContext:nil];

>将这些实体存储在数组中.
>根据需要将实体传回主线程.
释放任何你不想保留的对象
>调用任何你想保留的[myMainContext insertObject:managedobject].
>在NSManagedobjectContext上执行保存.

由于这些实体不是NSManagedobjectContext的一部分,它们只存在于内存中,并且应该是线程安全的,因为它们尚未绑定到NSManagedobjectContext.

这当然是理论的,需要测试.但是它应该完成你的目标.

总结

以上是内存溢出为你收集整理的objective-c – 撤销主线程执行的Core Data插入全部内容,希望文章能够帮你解决objective-c – 撤销主线程执行的Core Data插入所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1030503.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存