核心数据:托管对象与上下文一起保存后如何撤消操作

Posted

技术标签:

【中文标题】核心数据:托管对象与上下文一起保存后如何撤消操作【英文标题】:Core data : how to undo operations once managed objects are saved with context 【发布时间】:2013-02-07 06:43:25 【问题描述】:

我正在尝试实现从服务器上的几个表中下载批量数据。

就我而言,有 16 张桌子。对于所有这些表,我将向服务器发出 10 个请求。这意味着我对相关表做了一些逻辑分组,但就像所有表都通过一种或另一种关系相互关联。

下载时需要考虑三种情况:

    将数据保存到本地的每个表中。 管理插入对象之间的关系。 处理下载过程中一个请求失败的情况,比如第 8 个请求失败。

我将对每个响应都采用这种方法:

    在托管对象上下文中插入数据。 通过触发 NSPredicate 并关联相关对象来管理关系。 保存上下文。

如果响应失败,我有两种选择:

    下次从失败的响应继续。 将所有保存的数据恢复到之前的状态。

第一种方法可能会导致一些数据不一致,所以我将采用第二种方法。

我知道如果未保存托管对象上下文,我们可以恢复更改,但是

是否可以恢复更改,如果托管对象上下文是 保存了吗?

我需要社区提供一些有用的答案。

请提出建议。

【问题讨论】:

【参考方案1】:

如果托管对象上下文已保存,是否可以恢复更改?

保存后?也许吧,但这可能很棘手。如果您为网络操作设置单独的托管对象上下文,并给它一个NSUndoManager,您可以稍后告诉撤消管理器将所有内容回滚到以前的状态。

不过,在完成之前不保存更改会更简单。使用撤消管理器并没有太大帮助——存储所有撤消操作所需的内存至少会与保存所有未保存的更改直到完成之前的内存使用量相匹配。如果您正在处理单独的托管对象上下文(无论是子上下文还是完全独立的上下文),处理错误情况就像让 MOC 在不先保存更改的情况下被释放一样简单。

【讨论】:

嗨,汤姆,谢谢您的回复 :-).. 我还有一个疑问:假设我决定在第 10 次(在我的情况下为最后一次)回复结束时保存所有内容,不会考虑到数据量,托管对象上下文会消耗大量内存吗? 可能是的,具体取决于导入的大小。但是没有很好的方法可以在保存更改后回滚更改。例如,没有检查点机制。如果你真的需要所有 10 个导入来保证数据完整性,你可能会遇到问题。也许您可以在开始导入过程之前对其进行测试?您可能还会发现这份来自 Apple 的指南很有用:developer.apple.com/library/mac/ipad/#documentation/Cocoa/… 再次感谢您的有用输入:-)

以上是关于核心数据:托管对象与上下文一起保存后如何撤消操作的主要内容,如果未能解决你的问题,请参考以下文章

更新当前的 CoreData 条目

撤消托管对象删除

在后台线程上安全保存 Core Data 托管对象上下文的正确方法?

核心数据获取...为啥在将托管对象插入上下文 A 并保存上下文 A 后,不使用上下文 B 获取托管对象?

核心数据和托管对象上下文

在核心数据中保存到托管对象上下文时的 SIGABRT