取消编辑:NSUndoManager 或单独的 NSManagedObjectContext 进行编辑?
Posted
技术标签:
【中文标题】取消编辑:NSUndoManager 或单独的 NSManagedObjectContext 进行编辑?【英文标题】:Cancelling edits: NSUndoManager or separate NSManagedObjectContext for editing? 【发布时间】:2011-05-31 13:26:28 【问题描述】:我有一个视图控制器,它管理一个始终以编辑模式显示的视图。该视图本质上是一个表格视图,类似于 Apple 的联系人应用程序中的联系人详细信息。我的视图下的模型由一个由根实体组成的 2 级对象图表示 - 称之为 R
- 与子实体 C
具有一对多关系。现在,R
是一个大对象(它有 20 多个属性,所有属性都是可编辑的,但不是强制性的)。默认情况下,R
有 n
子对象(n
是一个可配置的值),但是可以通过我的编辑视图将子对象添加到 R
的集合中或从其中删除子对象,并且可以通过 C
的属性也可以编辑。请注意,C
实体包含图像元数据的属性,因此在编辑时可能会选取图像并与模型相关联。
对R
及其子项的编辑是通过主表视图表单以及从我导航(来回)到的“辅助”视图执行的,以便根据情况收集所需的信息。
我的问题是,在这种情况下,您将如何实施“取消所有编辑”,即我应该如何隔离所有编辑以轻松恢复到编辑前的状态?将NSUndoManager
与我的主要NSManagedObjectContext
一起使用?有单独的NSManagedObjectContext
进行编辑?每个人的权衡是什么?
我不在乎redo
。我正在寻找一种想法/解决方案,可以在编辑时使用的内存量与如果应用程序在编辑时中断时保存用户数据的能力之间取得平衡。
感谢您的所有想法。
【问题讨论】:
【参考方案1】:我建议不要在两个不同视图中具有相同编辑功能的设计。每个视图应该代表数据模型的不同实体/类的对象,因此应该有不同的编辑器和撤消管理。
联系人应用程序显示了这是如何完成的。您可以在主表视图中删除整个联系人,在详细视图中删除单个联系人属性。当视图消失时,每个视图中的更改都会提交。这样的设置不仅使撤消管理更容易,而且使用户更容易准确地了解他们正在做的更改。
如果您想坚持原来的设计,我建议保留主表视图的撤消堆栈,直到主表完全卸载,即不是在详细视图加载时。
【讨论】:
感谢您的建议。在联系人应用程序中,地址可以直接添加到主表视图中(在编辑时)。我想地址被建模为与联系人本身不同的实体。我有一个非常相似的案例。你会说 NSUndoManager 是取消对多个实体的编辑的最佳工具吗?或第二个上下文来隔离编辑?我选择哪个选项重要吗?【参考方案2】:我得出结论 here 为使 NSUndoManager
与 Core Data 一起正常工作,必须在子上下文中完成。由于子上下文为您提供“取消所有编辑”功能,因此您也不需要NSUndoManager
。因此,每个可取消的视图控制器都应该在子上下文中完成它的工作。这意味着,例如,控制器 A 将使用文档上下文的子节点,如果它与控制器 B 连接,则将使用 A 上下文的子节点(文档上下文的孩子的孩子)。如果用户按下保存,则会保存上下文,该上下文会自动将更改传播到父级。如果用户按下取消,上下文将被丢弃,从而忽略更改。唯一的问题是 iPad 应用程序中 A 和 B 可能都可见并且用户在 A 上按保存(但这可能只是糟糕的设计)。
【讨论】:
以上是关于取消编辑:NSUndoManager 或单独的 NSManagedObjectContext 进行编辑?的主要内容,如果未能解决你的问题,请参考以下文章