我想将NSManagedObject
的子类作为NSDictionary
的键。因此,我必须遵守NSCopying
并实施copyWithZone:
。
起初我虽然必须做类似的事情:
-(id)copyWithZone:(NSZone*)zone{
return [NSEntityDescription insertNewObjectForEntityForName:@"Thing" inManagedObjectContext:self.context]
}
然而,这会产生在我的数据库中插入新内容的副作用,我想避免这种情况。
在NSCopying
中实施NSManagedObject
的最佳方法是什么?
答案 0 :(得分:2)
NSManagedObject
的实例是可变的,这不会使它成为字典键的一个非常好的候选者(这当然是NSDictionary
复制键值的原因 - 如果原始键是可变的副本不会改变。)
那么您希望将托管对象的当前值用作密钥,还是将对象与托管对象本身关联,而不管其当前值是什么?
如果是后者,则应考虑使用托管对象的objectID
属性作为密钥,此属性唯一标识托管对象。此属性的类型为NSManagedObjectID
,这是一个实现NSCopying
。
HTH
答案 1 :(得分:1)
在NSCopying
上实施NSManagedObject
不是一个好主意。正如您所发现的那样,他们并不适合这种模式。实例链接到其托管对象上下文并从那里链接到持久性存储的事实意味着除非执行想要复制它,否则复制没有意义。当然,复制是NSCopying
的整点。
@CRD提出了一些很好的建议。根据您的需要,另一种方法是使用NSMapTable
代替NSDictionary
。它与NSDictionary
类似,但差异包括不需要符合NSCopying
的弱引用键。