0

一个常见的场景是有一个允许添加或编辑底层模型的视图,我们可以简单地使用 a 获取视图,如果为 nilinitWithObject:(MyManagedObject*)object则创建一个新视图。object

现在离开视图时,我们可以询问ManagedObjectContext它是否脏,但是我们如何知道它是因为object被修改了,还是因为其他objects地方可能已经被修改了?

如果我们想为用户提供一个cancel选项,如何rollback仅对当前进行更改object(并删除object如果它只是在此视图中新创建的?)

是否建议使用多个ManagedObjectContexts?(每个视图一个?——在这种情况下,同步可能会成为一个问题,不是吗?)或者应该使用UndoManager? 这可以使用来实现undoGroups吗?

4

1 回答 1

2

我知道三种常见的方法。当然,我很想听听其他人发布他们是如何处理这个问题的。

撤消组 在以模态方式呈现详细视图控制器(带有保存和取消选项)之前,我创建了一个撤消组,然后在托管对象上下文中创建一个托管对象实例并进行初步设置。

在保存和取消的委托方法上,我结束了撤消组,并且通过取消我还做了一个 undoNestedGroup。

好:您可以轻松撤消编辑。坏:如果您不想取消某些操作,那将非常棘手。换句话说,它是一种取消全有或全无的方法。

手动处理 这在添加新项目时非常可行,因为很难跟踪单个编辑。这基本上意味着在您的取消委托方法中,您在显示详细视图控制器之前删除了您知道添加的对象。

草稿上下文 这意味着您将创建另一个托管对象上下文实例,您可以将其合并回主上下文或丢弃所有更改。正如您所说,合并部分可能会有些痛苦,但它是完全可行的。与接近的撤消组相比,这具有仅合并您保存的更改的好处。因此,虽然仍然有点棘手,但您可以更好地微调,要保留哪些更改以及要取消哪些更改。

在 iOS5 中,Apple 添加了嵌套上下文,您可以在其中轻松创建子上下文以供详细视图控制器使用,也可以保存或丢弃。不需要额外的代码来处理上下文的合并。

好:在你准备好保存之前,你保持你的主要上下文不受所有修改的影响。不好:在 iOS5 之前实现起来更复杂(它引入了很棒的嵌套上下文)。

此致,

斯文。

于 2012-05-27T08:49:03.923 回答