我正面临一个架构问题,我想知道是否有人知道我的想法是否可行或是否有更好的架构理念。
我的情况是我有CoreData数据模型用于跟踪一些财务数据,想象它是银行账户(它不是那么担心安全事情)。核心数据对象的数据主要是用户输入。
我很清楚如何制作用户输入屏幕(在主窗口顶部实现工作表)以及如何为这些输入工作表实现撤消。对于像编辑帐户这样的简单工作表,我只需将数据从相关核心数据对象复制到工作表的控制器,然后在OK-Close上回写。写回CoreData对象包含在撤消分组中,这为我提供了一个可撤消的操作,可以在编辑之前将状态恢复到状态。这很好。
现在我正在考虑一个更复杂的编辑控件,其中帐户上的事务将以可编辑的网格(如excel)显示,并且可以编辑,添加或删除操作。对于此控件,将所有数据复制到新数据结构似乎很困难。相反,我考虑直接使用核心数据存储作为数据源,这意味着核心数据对象会随着用户编辑控件中的行而更改,创建和删除。在这个控件中,我知道如何逐步撤消。
如果用户随后单击取消,则会在编辑会话结束时出现此问题。我想处理这个实例我可以将控件中的所有操作包装到一个撤消组中并撤消它。
问题是,在此之后,取消的操作可以作为重做堆栈上的重做。一旦用户执行了另一个可撤消操作,就会清除此信息,但我希望确保完全不会记录此重做操作。
我想到的解决方法是在取消之后执行一些可撤消的一些(无操作)动作来清除重做堆栈,但是这个无操作在撤消堆栈中显示,这也是不合需要的。
基本上我想要做的是在激活复杂编辑表之前对某个状态执行某种形式的核心数据回滚,而不会重新执行此回滚。编辑表是模态的,可以保证在编辑表处于活动状态时核心数据模型中不会发生其他更改。
另外值得了解的是,核心数据上下文不能保证在激活编辑表之前保存,因此简单地丢弃上下文并从持久存储中重新加载不是一种选择。 (并且也会失去以前的撤消历史记录,我不想要)
那么简单的问题是,如何清除核心数据NSUndoManager的重做堆栈?更一般地,有人知道这是否是我的问题的正确解决方案或我应该在哪里寻找更好的设计解决方案?