ios - 带循环的 NSManagedObject 子类的深拷贝

标签 ios core-data nsmanagedobject deep-copy

我希望能够正确地深拷贝一个 NSManagedObject 子类的对象。

我的数据模型的一个高度简化的版本是:“父”对象,每个对象引用(1 到多个)几个“子”对象,每个子对象引用(多对多)几个“标签”对象。所有对象都是 NSManagedObject 的自定义子类。

要注意的是,“父”对象还引用(1 到多个)其“子”对象使用的所有“标签”对象,以及可能不会被任何“子”使用的其他“标签”(我的想法是,这为我提供了一种简单的方法来提取潜在“标签”列表,供用户添加到“ child ”。)

没有“子”或“标签”对象被多个“父”共享。

因此,每个“ parent ”有多个“ child ”和多个“标签”,每个“ child ”有一个“ parent ”和多个“标签”,每个“标签”有一个“ parent ”和多个“ child ”。

我希望能够深拷贝'parent'对象,维护整个对象树,但是我不知道如何解决'parent'>'child'>'label'>'parent'的循环...等等

如果在复制“父”时,我首先复制了它引用的所有“子”对象,然后那些“子”对象复制了它们引用的“标签”并将它们添加到“子”的“父”的“标签”列表中,那么我该如何解释那些应该在“ parent 的”“标签”列表中但没有被任何“ child ”引用的“标签”。如果我将原始“ parent ”的“标签”列表的副本合并到新列表中,我最终会得到一个列表,其中包含来自“子”对象(确实想要)的“标签”,以及与“ child ”(想要),加上与旧“ parent ”的“ child ”对象相关联的“标签”的副本(不想要)。

相反,如果我先复制“父级”引用的“标签”对象,那么它们就不能链接到它们应该链接到的“子级”对象,因为“子级”对象尚不存在。

啊啊啊!

如果这听起来有点令人困惑,那是因为它确实如此。至少,这让我感到困惑。

最佳答案

这很重要,但已在其他问题中有所解决。希望人们能想出更简单的答案。请参阅:How to make Deep Copy of NSManagedObject in Core Data

编辑:一种策略是将关系元数据用于由父/子引起的循环引用。从 NSManagedObject 的实体中,获取 NSRelationshipDescription 对象并检查反向关系。

我使用的第二个策略是树(带有父引用形式的反向链接),其中每个对象应该只出现一次。每当您克隆一个对象时,将该对象的原始版本添加到一个集合中。在从原始结构克隆对象之前,请检查它的集合。如果存在,请勿复制。另外,Core Data应该给你填反比关系。如果递归,则在每次方法调用时传递集合。它需要对结构具有全局性。

关于ios - 带循环的 NSManagedObject 子类的深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6269088/

相关文章:

ios - 如何将 subview 添加到 ScrollView 的 subview

ios - 不兼容的指针类型

objective-c - 为什么使用 Core Data 的人想要在同一个托管对象模型中使用多个持久存储?

ios - 在索引 0 处插入元素,NSManagedObject

ios - 从 NSArray 中删除 double (NSManagedObjects) 的更好方法(也是逻辑缺陷)

ios - Swift 3 或 4 保存到自定义相册会创建重复图像

javascript - 如何在 react-native 中单击抽屉导航的右键单击打开下一个屏幕?

objective-c - 如何使用 nspredicate 对非英文字符串进行排序?

ios - UITextField 不会将文本保存到 CoreData 中

ios - 核心数据 - 遍历 NSManagedObject 的属性