常见的情况是拥有一个允许添加或编辑基础模型的视图,
我们可以使用initWithObject:(MyManagedObject*)object
来简单地获取视图
如果object
为零,则创建一个新的
现在离开视图时,我们可以询问ManagedObjectContext
它是否脏,但我们如何知道它是否因为object
被修改而变脏,或者是由于其他{{1}可能在其他地方被修改过了吗?
如果我们想为用户提供objects
选项,那么cancel
仅对当前rollback
进行更改{并删除object
刚刚在这个视图中新创建了吗?)
是否建议使用多个object
? (每个视图一个? - 在这种情况下,同步可能会成为一个问题,不是吗?)或者应该使用ManagedObjectContext
?可以使用UndoManager
来实现吗?
答案 0 :(得分:2)
我知道有三种常见的方法。而且我肯定希望听到其他人发布他们如何处理这个问题。
撤消群组 在以模态方式呈现详细视图控制器(使用保存和取消选项)之前,我创建一个撤消组,然后在托管对象上下文中创建一个托管对象实例并进行初步设置。
关于保存和取消的委托方法我结束撤消组,使用取消我也做了一个undoNestedGroup。
好:您可以轻松撤消修改。 不好:如果有一些超出你想要取消的行动,那将是非常棘手的。换句话说,它取消了全有或全无的方法。
手动处理 这在添加新项目时非常可行,因为跟踪单个编辑太难了。它基本上意味着在你的委托取消方法中删除你知道你添加的对象,然后再展示详细的视图控制器。
草稿上下文 这意味着您将创建另一个托管对象上下文实例,您可以将其合并回主上下文,也可以抛弃所有更改。正如你所说,合并部分可能有些痛苦,但它完全可行。与接近的撤消组相比,这样做的好处是只能合并您保存的更改。因此,虽然仍然有点棘手,但您可以更好地微调,您想要保留哪些更改以及您想要取消哪些更改。
使用iOS5 Apple添加了嵌套上下文,您可以在其中轻松创建子上下文,以供详细的视图控制器使用,只需保存或丢弃即可。不需要额外的代码来处理上下文的合并。
好:在准备好保存之前,不要对所有修改保持主要背景。 不好:在iOS5之前实现起来比较复杂(引入了很棒的嵌套上下文)。
致以最诚挚的问候,
斯文。