Сравнение двух NSManagedObjects
У меня есть некоторый код, который проходит через массив NSManagedObjects и останавливается, когда он находит определенную запись, которая хранится в переменной экземпляра. Единственный способ, которым я могу увидеть, являются ли они одной и той же записью (не эквивалентной записью, конкретной записью), - это сравнение URIRepresentations объектов. Это, конечно, не лучший способ сделать это. Я делаю:
if ([[[obj1 objectID] URIRepresentation] isEqualTo: [[_obj2 objectID] URIRepresentation]]) {
NSLog(@"Match");
}
Следующий код никогда не совпадает, даже когда я NSLog objectIDs и вижу, что они на самом деле точно так же.
if ([[obj1 objectID] isEqualTo: [_obj2 objectID]]) {
NSLog(@"Match");
}
2 ответа:
Комментатор прав, isEqualTo: не будет работать в этом случае, так как они являются различными экземплярами NSManagedObjectID.
На самом деле это лучший способ, objectID-уникальный идентификатор CoreData для данного управляемого объекта, это единственный способ определить, указывают ли два экземпляра NSManagedObject на одну и ту же запись в постоянном хранилище.
Уточнение:
ImHuntingWabbits ссылается на
isEqual:
, но затем советует Нику придерживаться своего первого примера, который фактически используетisEqualTo:
.Согласно комментарию Питера Хоси к сообщениюisEqual vs isEqualTo , Есть разница, и вам лучше использовать
isEqual:
.После этих сообщений я первоначально использовал
isEqualTo:
Для сравнения URL-адресов objectID, которые прекрасно работали в Cocoa, но когда я перенес этот код на iOS, я получил предупреждения, что " NSURL может не реагировать на исэквальто."Когда я перешел наisEqual:
, предупреждения исчезли.Итак, если вы следуете этим примерам, вам, вероятно, следует сделать следующее:
if ([[[obj1 objectID] URIRepresentation] isEqual:[[_obj2 objectID] URIRepresentation]] { NSLog(@"Match"); }