我希望能够正确地深拷贝一个 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/