使用核心数据管理对象添加或编辑的正确方法

时间:2012-05-27 07:42:52

标签: objective-c core-data

常见的情况是拥有一个允许添加或编辑基础模型的视图, 我们可以使用initWithObject:(MyManagedObject*)object来简单地获取视图 如果object为零,则创建一个新的

现在离开视图时,我们可以询问ManagedObjectContext它是否脏,但我们如何知道它是否因为object被修改而变脏,或者是由于其他{{1}可能在其他地方被修改过了吗?

如果我们想为用户提供objects选项,那么cancel仅对当前rollback进行更改{并删除object刚刚在这个视图中新创建了吗?)

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

1 个答案:

答案 0 :(得分:2)

我知道有三种常见的方法。而且我肯定希望听到其他人发布他们如何处理这个问题。

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

关于保存和取消的委托方法我结束撤消组,使用取消我也做了一个undoNestedGroup。

好:您可以轻松撤消修改。 不好:如果有一些超出你想要取消的行动,那将是非常棘手的。换句话说,它取消了全有或全无的方法。

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

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

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

好:在准备好保存之前,不要对所有修改保持主要背景。 不好:在iOS5之前实现起来比较复杂(引入了很棒的嵌套上下文)。

致以最诚挚的问候,

斯文。