Сравнение двух NSManagedObjects


У меня есть некоторый код, который проходит через массив NSManagedObjects и останавливается, когда он находит определенную запись, которая хранится в переменной экземпляра. Единственный способ, которым я могу увидеть, являются ли они одной и той же записью (не эквивалентной записью, конкретной записью), - это сравнение URIRepresentations объектов. Это, конечно, не лучший способ сделать это. Я делаю:

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

Следующий код никогда не совпадает, даже когда я NSLog objectIDs и вижу, что они на самом деле точно так же.

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

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");
}