比较两个NSManagedObjects

时间:2011-01-19 05:34:26

标签: objective-c core-data nsmanagedobject

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

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

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

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

3 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:12)

澄清:

ImHuntingWabbits引用isEqual:,但后来建议Nick坚持他的第一个例子,它实际上使用了isEqualTo:

根据Peter Hosey对帖子isEqual vs isEqualTo的评论,存在差异,您最好使用isEqual:

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

因此,如果您关注这些示例,您应该这样做:

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

答案 2 :(得分:6)

-isEqual:已针对CoreData中的NSManagedObjectID正确实现。我们一直使用带有-contains的集合:似乎原来的海报混淆了-isEqual:with -isEqualTo:后者不应该被使用。