带有循环的 NSManagedObject 子类的深拷贝
Posted
技术标签:
【中文标题】带有循环的 NSManagedObject 子类的深拷贝【英文标题】:Deep copy of NSManagedObject subclasses with loops 【发布时间】:2011-06-07 17:18:45 【问题描述】:我希望能够正确地深度复制作为 NSManagedObject 子类的对象。
我的数据模型的一个高度简化的版本是:“父”对象,每个对象都引用(1 对多)几个“子”对象,每个对象都引用(多对多)几个“标签”对象。所有对象都是 NSManagedObject 的自定义子类。
要注意的是,“父”对象还引用(1 到多个)其“子”对象使用的所有“标签”对象,以及可能不会被任何“子”对象使用的其他“标签”(这个想法是,这给了我一个简单的方法来拉出一个潜在的“标签”列表,供用户添加到一个“孩子”。)
没有“子”或“标签”对象由多个“父”共享。
所以,每个“父”有多个“子”和多个“标签”,每个“子”有一个“父”和多个“标签”,每个“标签”有一个“父”和多个“子”。
我希望能够深拷贝'父'对象,维护整个对象树,但我不知道如何解决'父'>'子'>'标签'>'父'的循环......等等
如果在复制“父”时,我首先复制所有引用的“子”对象,然后这些“子”对象复制其引用的“标签”并将它们添加到该“子”的“父”“标签”列表中,那么我如何解释那些不应该被任何“孩子”引用的“父母”“标签”列表中的“标签”。如果我将原始“父”的“标签”列表的副本合并到新的列表中,我最终会得到一个列表,其中包含来自“子”对象(确实想要)的“标签”,以及任何不相关的松散“标签” 'child'(想要),加上与旧的 'parent's 'child' 对象相关联的 'labels' 的副本(不想要)。
相反,如果我先复制“父”引用的“标签”对象,则它们无法链接到它们应该是的“子”对象,因为“子”对象还不存在。
啊啊啊!
如果这听起来令人困惑,那是因为确实如此。至少,这让我很困惑。
【问题讨论】:
【参考方案1】:这很重要,但已在其他问题中有所解决。希望人们能想出更简单的答案。见:How to make Deep Copy of NSManagedObject in Core Data
编辑:一种策略是将关系元数据用于由父/子引起的循环引用。从 NSManagedObject 的实体中,获取 NSRelationshipDescription 对象并检查反向关系。
我使用的第二种策略是树(带有父引用形式的反向链接),其中每个对象应该只出现一次。每当您克隆对象时,将对象的原始版本添加到集合中。在从原始结构克隆对象之前,请检查它的设置。如果存在,请勿复制。此外,Core Data 应该为您填写反比关系。如果您递归,请在每个方法调用中传递集合。它需要对结构是全局的。
【讨论】:
嗯,是的,我看过那个例子,但它似乎没有检查或解决循环,除非我遗漏了什么。 啊,现在这是一个想法。我正在考虑以某种方式标记已经复制的对象,将它们放入一组听起来很完美!谢谢。以上是关于带有循环的 NSManagedObject 子类的深拷贝的主要内容,如果未能解决你的问题,请参考以下文章
目标 c - 核心数据:无法调用 NSManagedObject 子类的私有方法
将我的 NSManagedObject 子类与我的 ViewController.swift 连接起来