我有一些代码循环遍历NSManagedObjects数组,并在找到存储在实例变量中的某条记录时停止。我能够设法查看它们是否是同一记录(不是等效记录,特定记录)的唯一方法是比较objectID的URIRepresentations。这肯定不是最好的方法。我在做:
if ([[[obj1 objectID] URIRepresentation] isEqualTo: [[_obj2 objectID] URIRepresentation]]) {
NSLog(@"Match");
}
以下代码永远不会匹配,即使我在NSLog对象ID并且看到它们实际上完全相同。
if ([[obj1 objectID] isEqualTo: [_obj2 objectID]]) {
NSLog(@"Match");
}
答案 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:后者不应该被使用。