NSDocument 对将文档标记为脏的支持直接来自 NSUndoManager。将文档更改为脏的最简单的方法是执行 Undo 的实现,这基本上意味着在文档正在使用的模型类(如果您选择处理所有存储,则为 NSDocument 的子类)内部执行撤消直接进去)。
苹果在这里有这方面的文档:http:
//developer.apple.com/library/ios/#documentation/cocoa/Conceptual/UndoArchitecture/Articles/AppKitUndo.html
由于您表示您有一系列字典,这将使其实施起来更加困难,但是一旦您确定了这一点,您就会处于良好状态。
或者,如果您不想使用 NSDocument 和 NSUndoManager 提供的免费支持,您可以手动处理 undo 并使用该updateChangeCount:
方法修改内部对是否发生更改的理解。这需要一些工作,并且可能比仅正确设置撤消有用得多。
至于观察数组中所有对象的效率,我不会担心,除非您对其进行了分析并发现它效率低下。KVO 真的非常高效,我们定期观察数组的每个元素中的多个值而没有发现性能问题。您必须观察数组本身才能处理添加和删除(假设您的数组有这个)。
不过,据我所知,您有一个selectedDictionary
用于确定显示的其他控件的。在这种情况下,您可以使用 KVO 来观察 selectedDictionary 的值,当它发生变化时,您可以从之前的 selectedDictionary 中移除观察者并将它们添加到当前 selectedDictionary 中的键中。无论如何,这基本上就是绑定为了处理显示和设置所做的事情。
这篇 StackOverflow 帖子中引用了我过去使用的另一个考虑因素:
NSMutableDictionary KVO。如果您在此处查看我的答案,我将概述在添加新密钥或删除现有密钥时获取通知的技巧。它还具有在有任何更改时向您发出通知的好处。这并不总是一个很好的解决方案,但它确实节省了对要观察的键列表进行编码的一些努力。
除此之外,您还必须添加您希望对文档的已保存状态产生影响的每个键。