【问题标题】:isEqual of NSManagedObject - How does it determine equality?NSManagedObject 的 isEqual - 它如何确定相等性?
【发布时间】:2013-07-10 01:48:24
【问题描述】:

我正在处理带有 NSManagedObject 键的 NSMutableDictionary。我的键中的一些数据会发生变异,但是 NSMutableDictionary 类引用指出使用 setObject 时会复制键!当我想使用键访问值时,它会将我给它的键与键列表中的键进行比较。

抱歉,这是一个愚蠢的问题,但我在 NSManagedObject 类参考中找不到 isEqual 的作用。它是比较每个值、比较一些唯一标识符、比较内存地址还是其他什么?

我在这里看到了一些不确定的答案:Should I use == or [NSManagedObject isEqual:] to compare managed objects in the same context?,其中一个说它比较了哈希方法。哈希码不一定是对象的唯一标识符,对吧?

【问题讨论】:

  • 你是如何让它工作的? NSManagedObjects 不符合 NSCoding,因此不应作为 NSDictionary 的键。相反,我建议使用 [nsManagedObject objectID] 作为键,因为它符合 NSCopy,并且您可以使用 isEqual: 正如您所期望的那样。
  • 它在 NSManagedObject 类参考中说它适用于大多数数据结构。我可能会遗漏一些东西,因为我对此很陌生,但 Xcode 似乎让我将它们作为键放入。无论如何,objectID 听起来是个好主意。
  • 好吧,澄清一下,这是个好主意。我使用 objectIDs 作为键。我不知道为什么我之前没有想到这一点......

标签: objective-c dictionary key


【解决方案1】:

我看到其他人已经在 cmets 中回答了 - 但对于它的“官方性” - 这是正确的详细答案。

由于NSManagedObjcet 类不符合<NSCoding> 协议 - 它不能用作NSDictionaryNSMutableDictionary 中的键。

相反,您可能希望使用 managedObject 的 objectID 属性作为字典中的键。 objectID是一个NSString,当然符合NSCoding

使用objectID 有另一个好处。如果您有多个NSManagedObjectContext,则同一实体将为每个NSManagedObjectContext 拥有不同的NSManagedOBject 实例。知道他们是一体的唯一方法 - 是通过他们的objectID 属性 - 这将是isEqual

【讨论】:

  • 谢谢。我不记得我为什么要问这个问题,或者我是否设法拥有一本带有NSManagedObject 键的字典,但这是正确的答案。
  • 我仍然想念那里的一些理解-关于您原始问题的标题-我还不完全知道 isEqual 对 NSManagedObjects 做了什么-但是您在问题中描述的场景暗示这个答案会有所帮助。如果你觉得它有用——你能投票吗?
猜你喜欢
  • 2011-06-29
  • 2010-09-17
  • 1970-01-01
  • 2021-08-11
  • 2010-12-19
相关资源
最近更新 更多