核心数据 - 保存上下文后撤消更改

Nic*_*cky 7 core-data nsundomanager ios

我最近注意到Core Data中的撤销机制这个奇怪的事情,从那以后它一直困扰着我.

方法NSManagedObjectContext文档的引用-undo:

向接收方的撤消管理器发送撤消消息,要求它撤消应用于对象图中对象的最新未提交更改.

要扭转最新的未提交更改,听起来很简单吧?

然而,事实并非如此!即使我使用托管对象上的更改保存上下文,以下-undo调用仍将成功撤消更改.这不是针对文档中陈述的内容吗?

也许我做错了什么?如果需要,我可以发布我的小测​​试代码.我真的很困惑.

Fru*_*eek 5

应该感到困惑。Core Data 文档一团糟。他们以一种可以说是不恰当的方式使用了很多诸如“未承诺”之类的词。isFaulted当他们说“未提交”时,它们似乎表示属性等于 NO 的对象。

核心数据编程指南更详细:

更改和撤消管理

上下文保持对具有挂起更改(插入、删除或更新)的托管对象的强引用,直到上下文发送 save:、reset、rollback 或 dealloc 消息,或适当数量的撤消以撤消更改。

与上下文关联的撤消管理器保持对任何更改的托管对象的强引用。默认情况下,在 OS X 中,上下文的撤消管理器保持无限的撤消/重做堆栈。为了限制应用程序的内存占用,您应该确保removeAllActions在适当的时候清理(​​使用)上下文的撤消堆栈。除非您保持对上下文的撤消管理器的强引用,否则它将与其上下文一起解除分配。

文档中的措辞/词汇不明确或不一致。我相信预期的用途是您应该在适合您的应用程序时调用removeAllActions上下文的undoManager属性,以避免无限的内存增长。