【问题标题】:Implementing NSCopying in subclass of NSManagedObject在 NSManagedObject 的子类中实现 NSCopying
【发布时间】:2015-06-30 19:43:44
【问题描述】:

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

起初我虽然我不得不做类似的事情:

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

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

NSManagedObject 中实现NSCopying 的最佳方式是什么?

【问题讨论】:

  • NSDictionary 要求其密钥是不可变的。这就是为什么类型是id<NSCopying> 而不仅仅是idNSManagedObject 的实例与该合同不匹配。也许还有另一种方法更适合您要解决的问题。

标签: objective-c core-data nsdictionary nscopying


【解决方案1】:

NSManagedObject 的实例是可变的,这并不使其成为字典键的理想候选者(这当然是NSDictionary 复制键值的原因——如果原始键是可变的,则副本不会改变) .

那么您希望使用托管对象的 current 值作为键,还是将对象与托管对象本身关联起来而不考虑其当前值?

如果是后者,那么您应该考虑使用托管对象的objectID 属性作为您的键,该属性唯一标识一个托管对象。这个属性的类型是NSManagedObjectID,一个实现NSCopying的类。

HTH

【讨论】:

  • 如果能举个例子就好了:)
  • @coolly - 一个例子?答案是给出NSManagedObject *mobjNSMutableDictionary *dict 然后dict[mobj.objectID] 是有效的,并且objectID 唯一标识一个托管对象,这实际上是“由托管对象键入”。 HTH
【解决方案2】:

NSManagedObject 上实现NSCopying 不是一个好主意。正如您所发现的,它们不适合该模型。实例链接到其托管对象上下文并从那里链接到持久存储这一事实意味着复制没有意义,除非您确实想要复制它。当然,重复是NSCopying全部意义

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

【讨论】:

  • 一般来说,如果我们想要另一个 nsmanaged 对象的副本。使用这个新副本我想更改值。 NSCoying 对我的用例来说是个好主意吗?
猜你喜欢
  • 2011-05-27
  • 2015-03-24
  • 2011-08-18
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多