在NSManagedObject的子类中实现NSCopying

时间:2015-04-22 21:54:53

标签: objective-c core-data nsdictionary nscopying

我想将NSManagedObject的子类作为NSDictionary的键。因此,我必须遵守NSCopying并实施copyWithZone:

起初我虽然必须做类似的事情:

-(id)copyWithZone:(NSZone*)zone{
     return [NSEntityDescription insertNewObjectForEntityForName:@"Thing" inManagedObjectContext:self.context]
}

然而,这会产生在我的数据库中插入新内容的副作用,我想避免这种情况。

NSCopying中实施NSManagedObject的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

NSManagedObject的实例是可变的,这不会使它成为字典键的一个非常好的候选者(这当然是NSDictionary复制键值的原因 - 如果原始键是可变的副本不会改变。)

那么您希望将托管对象的当前值用作密钥,还是将对象与托管对象本身关联,而不管其当前值是什么?

如果是后者,则应考虑使用托管对象的objectID属性作为密钥,此属性唯一标识托管对象。此属性的类型为NSManagedObjectID,这是一个实现NSCopying

的类

HTH

答案 1 :(得分:1)

NSCopying上实施NSManagedObject不是一个好主意。正如您所发现的那样,他们并不适合这种模式。实例链接到其托管对象上下文并从那里链接到持久性存储的事实意味着除非执行想要复制它,否则复制没有意义。当然,复制是NSCopying整点

@CRD提出了一些很好的建议。根据您的需要,另一种方法是使用NSMapTable代替NSDictionary。它与NSDictionary类似,但差异包括不需要符合NSCopying的弱引用键。