具有循环的NSManagedObject子类的深层副本

时间:2011-06-07 17:18:46

标签: ios core-data nsmanagedobject deep-copy

我希望能够正确深度复制NSManagedObject子类的对象。

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

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

没有'子'或'标签'对象由多个'父母'共享。

因此,每个“父母”都有多个“孩子”和多个“标签”,每个“孩子”都有一个“父母”和多个“标签”,每个“标签”都有一个“父母”和多个“孩子”。

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

如果在复制“父”时,我首先复制它所引用的所有“子”对象,并且那些“子”对象复制其引用的“标签”,并将它们添加到“子”的父级“标签”列表中,那么我如何解释那些应该在“父母”标签列表中的“标签”,这些标签不会被任何“孩子”引用。如果我将原始“父母”标签列表的副本合并到新的标签列表中,我最终会得到一个包含“子”对象中“标签”的列表(确实需要),以及任何与“父”对象无关的松散“标签” 'child'(确实需要),以及与旧'父母''子'对象相关联的'标签'副本(不想要)。

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

Aaaargh!

如果这听起来令人困惑,那是因为它是。至少,这让我很困惑。

1 个答案:

答案 0 :(得分:0)

这是非平凡的,但在其他问题上已经有所解决。希望人们可以提出更简单的答案。请参阅:How to make Deep Copy of NSManagedObject in Core Data

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

我使用的第二个策略是树(具有父引用形式的反向链接),其中每个对象应该只出现一次。无论何时克隆对象,都要将对象的原始版本添加到集合中。在从原始结构克隆对象之前,请检查该对象的设置。如果存在,请不要复制它。此外,核心数据应为您填写反比关系。如果递归,请在每次方法调用时传递该设置。它需要在结构上具有全局性。