1

我有一种情况,我必须将一个 NSManagedObject 从主上下文复制到编辑上下文中。正如我在 Stackoverflow 中描述的类似情况中看到的那样,对大多数人来说这听起来没有必要,但我看起来需要它。

在我的应用程序中,标签栏中有许多视图,每个视图处理与其他视图相关的不同信息。我认为我需要多个 MOC,因为用户可能会从一个选项卡跳转到另一个选项卡,并在某个选项卡中留下未保存的更改,但它可能会将数据保存在其他一些选项卡/视图中,因此如果发生这种情况,其余视图中的更改将在未经用户同意的情况下保存在最坏的情况下会使应用程序崩溃。

为了添加新信息,我使用添加 MOC 然后合并两个 MOC 中的更改,但编辑并不那么容易。我在 Stackoverflow 中看到了类似的情况,但是应用程序崩溃了,因为我的数据模型似乎没有使用 NSMutableSet 来处理关系(我认为我没有多对多关系,只是一对多)我认为它可以修改,所以我可以检索关系,就好像它们是属性一样

for (NSString *attr in relationships) {
    [cloned setValue:[source valueForKey:attr] forKey:attr];
}

但我不知道如何合并克隆对象和原始对象的更改。我想我可以从主上下文中删除对象,然后合并两个上下文并在主上下文中保存更改,但我不知道这样做是否正确。我还担心数据库完整性,因为我不确定反向关系是否会保持对克隆对象的相同引用,就好像它是原始对象一样。

有人可以请教我吗?

4

1 回答 1

3

哇,这其中有很多问题和随机性。首先,您不需要为自己的问题添加评论,最好自己编辑问题。

NSManagedObjectContext其次,如果您正在运行单线程应用程序,则不需要多个实例。您的整个应用程序可以轻松地从单个实例运行。多个上下文适用于罕见的边缘情况和多线程情况。

通过使用单个上下文,它将解决您尝试克隆的所有问题。但是,如果您仍然想知道如何对 a 进行深度复制,您可以从我的The Pragmatic ProgrammersNSManagedObject书中的示例代码中获得一些指导;其源代码可免费下载。

更新

所有NSManagedObjectContext实例都是“编辑实例”。每个线程只需要一个上下文。如果您想在保存之前删除它们,您可以轻松询问未插入实体的上下文,并且您可以在实体更改时轻松保存它们。除了一些极端的边缘情况,您不需要第二个上下文。

更新

你仍然在为自己创造比你需要的更多的工作。您无需保存对象即可让视图消失。您可以在上下文中将任意数量的对象保留为未保存状态。

You are going to spend more time debugging dealing a deep copy of objects than it is worth with the design you are describing. If you are going to use more than one context, make sure they are attached to the same NSPersistentStoreCoordinator so that you don't need to copy the objects around, you can just save the "secondary" context and then catch the save notification in the main context.

于 2010-06-12T21:29:29.547 回答