Objective c 比较两个NSManagedObject

Objective c 比较两个NSManagedObject,objective-c,core-data,nsmanagedobject,Objective C,Core Data,Nsmanagedobject,我有一些代码在NSManagedObject数组中循环,当它找到存储在实例变量中的某个记录时停止。我能够设法确定它们是否是相同的记录(不是等效记录,而是特定记录)的唯一方法是比较objectid的表示形式。这肯定不是最好的办法。我正在做: if ([[[obj1 objectID] URIRepresentation] isEqualTo: [[_obj2 objectID] URIRepresentation]]) { NSLog(@"Match"); } 下面的代码永远不会匹配,即使我

我有一些代码在NSManagedObject数组中循环,当它找到存储在实例变量中的某个记录时停止。我能够设法确定它们是否是相同的记录(不是等效记录,而是特定记录)的唯一方法是比较objectid的表示形式。这肯定不是最好的办法。我正在做:

if ([[[obj1 objectID] URIRepresentation] isEqualTo: [[_obj2 objectID] URIRepresentation]]) {
  NSLog(@"Match");
}
下面的代码永远不会匹配,即使我记录了objectid并看到它们实际上完全相同

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

注释者是正确的,isEqualTo:在本例中不起作用,因为它们是NSManagedObjectID的不同实例

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

说明:

ImHuntingWabbits引用了
isEqual:
,但随后建议Nick继续使用他的第一个示例,该示例实际上使用了
isEqualTo:

根据Peter Hosey在文章中的评论,两者之间存在差异,最好使用
isEqual:

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

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

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

-isEqual:已为CoreData中的NSManagedObjected正确实现。我们始终使用带有-contains:的集合。原始海报似乎将-isEqual:与-isEqualTo:混淆了。不应使用后者。

在这种情况下,调用isEqualTo:与[obj1 objectID]==[obj2 objectID]相同,因为NSManagedObjectID不覆盖isEqual:。您必须从两个调用中接收完全相同的对象,才能返回YES。实际上,他仍然希望使用isEqual,只使用对象ID。使用URI表示要慢得多。