【问题标题】:Comparing two NSManagedObjects比较两个 NSManagedObjects
【发布时间】:2011-06-11 13:12:19
【问题描述】:

我有一些代码循环遍历 NSManagedObjects 数组,并在找到存储在实例变量中的特定记录时停止。我可以设法查看它们是否是相同记录(不是等效记录,特定记录)的唯一方法是比较 objectID 的 URIRepresentations。这肯定不是最好的方法。我在做:

if ([[[obj1 objectID] URIRepresentation] isEqualTo: [[_obj2 objectID] URIRepresentation]]) {
  NSLog(@"Match");
}

即使我 NSLog 对象 ID 并看到它们实际上完全相同,以下代码也永远不会匹配。

if ([[obj1 objectID] isEqualTo: [_obj2 objectID]]) {
  NSLog(@"Match");
}

【问题讨论】:

  • 在这种情况下,调用 isEqualTo: 与 [obj1 objectID] == [obj2 objectID] 相同,因为 NSManagedObjectID 不会覆盖 isEqual:。您必须从两个调用中接收完全相同的对象才能返回 YES。

标签: objective-c core-data nsmanagedobject


【解决方案1】:

评论者是正确的,isEqualTo: 在这种情况下不起作用,因为它们是 NSManagedObjectID 的不同实例。

您这样做的方式实际上是最好的方式,objectID 是 CoreData 对给定托管对象的唯一标识符,它是判断 NSManagedObject 的两个实例是否指向持久存储中的同一记录的唯一方法。

【讨论】:

    【解决方案2】:

    -isEqual: 已为 CoreData 中的 NSManagedObjectID 正确实现。我们一直使用带有 -contains: 的集合。看来原贴混淆了 -isEqual: 和 -isEqualTo: 后者不应该使用。

    【讨论】:

      【解决方案3】:

      澄清:

      ImHuntingWabbits 指的是isEqual:,但随后建议尼克坚持他的第一个示例,该示例实际上使用了isEqualTo:

      根据 Peter Hosey 对帖子 isEqual vs isEqualTo 的评论,这是有区别的,您最好使用 isEqual:

      按照目前的帖子,我最初使用 isEqualTo: 来比较 objectID URL,这在 Cocoa 中运行良好,但是当我将此代码移至 iOS 时,我收到“NSURL 可能无法响应 isEqualTo”的警告。当我更改为isEqual: 时,警告消失了。

      因此,如果您遵循这些示例,您可能应该这样做:

      if ([[[obj1 objectID] URIRepresentation] isEqual:[[_obj2 objectID] URIRepresentation]] {
          NSLog(@"Match");
      }
      

      【讨论】:

      • 实际上他仍然想使用 isEqual 而只是对象 ID。使用 URI 表示会慢很多。
      猜你喜欢
      • 2016-10-24
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多