Подтвердить что ты не робот

Сравнение двух объектов NSManagedObjects

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

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

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

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

Ответ 1

Комментарий правильный, isEqualTo: в этом случае работать не будет, поскольку они являются разными экземплярами NSManagedObjectID.

То, как вы это делаете, на самом деле является лучшим способом, objectID является уникальным идентификатором CoreData для данного управляемого объекта, это единственный способ узнать, указывают ли два экземпляра NSManagedObject на одну и ту же запись в постоянном хранилище.

Ответ 2

Разъяснение:

ImHuntingWabbits относится к isEqual:, но затем советует Нику придерживаться своего первого примера, который фактически использует isEqualTo:.

Per Peter Hosey комментировать сообщение isEqual vs isEqualTo, есть разница, и вам лучше использовать isEqual:.

В соответствии с текущими сообщениями я первоначально использовал isEqualTo: для сравнения URL-адресов объектов, которые отлично работали в Cocoa, но когда я переместил этот код в iOS, я получил предупреждения о том, что "NSURL может не отвечать на isEqualTo". Когда я изменился на isEqual:, предупреждения исчезли.

Итак, если вы следуете этим примерам, вы должны, вероятно, сделать это:

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

Ответ 3

-isEqual: был правильно реализован для NSManagedObjectID в CoreData. Мы постоянно используем коллекции с -contains:. Кажется, что исходный плакат запутался - isEqual: с -isEqualTo: последнее не должно использоваться.