2017-09-12 35 views
0

我有以下核心数据模型:的iOS CoreData提交子交易,但取消主事务

A - > B(1:1)

A - > C(1至n)

我创建了一个视图控制器VC来编辑A实例的任何属性。在该VC中,我想添加创建C的新实例的可能性,以便用户可以根据需要随时添加新的Cs。现在我只需将这些添加到viewContext并保存即可。这有效,但有一点小生意。一旦我将新C保存到上下文中,我就无法回滚之前对A所做的任何更改。

因此,我研究了this tutorial,发现我认为单独的任何更改应该应用于其自己的子上下文中。我明白,但我仍然有一个问题:本教程指出,对childContext所做的任何更改都会在保存时推送到它的父级,但除非保存parentContext,否则它将永远不会写入磁盘。现在,如果我不想保存父上下文,因为用户点击取消按钮以回滚其他更改,那么我如何仍然保留新的Cs?

回答

0

不要将数据直接保存到实体A,B或C中的任何一个的ManagedObject(CoreData对象),而应创建一个模型,根据用户输入或任何数据源更新模型。您需要为A,B或C创建管理对象,并在用户确认保存数据时为各个属性设置值。这意味着如果用户点击取消,数据将不会保存到CoreData,但您将能够在模型对象生命周期中找到模型中的以前的数据。

+0

现在我使用rollback() - 方法来取消所有更改。但是,这也可能影响我实际想要保持的变化,例如,新的Cs。为我的每个核心数据实体创建附加模型似乎非常不方便。这是实现我想要的唯一途径吗? – Martin

+0

在这种情况下,@Martin可以创建一个子父管理对象上下文,该子父管理对象上下文的父级是主上下文,对子管理对象上下文进行所有更改。当子托管对象上下文保存其更改时,会将其推送到与其链接的父托管对象上下文。直到父管理对象上下文执行保存操作,将其更改推送到其持久存储协调器,这些更改才会推送到持久存储协调器。你可以按照下面的链接https://cocoacasts.com/the-elegance-of-disposable-managed-object-contexts/。 –