Сравнение двух NSManagedObjects - PullRequest
21 голосов
/ 19 января 2011

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

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

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

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

Ответы [ 3 ]

19 голосов
/ 25 февраля 2011

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

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

12 голосов
/ 10 февраля 2012

Пояснение:

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

За комментарий Питера Хоси к посту isEqual vs isEqualTo , есть разница, и вам лучше использовать isEqual:.

После настоящих постов я первоначально использовал isEqualTo: для сравнения URL-адресов objectID, которые отлично работали в Какао, но когда я переместил этот код на iOS, я получил предупреждение о том, что «NSURL может не отвечать на isEqualTo». Когда я изменился на isEqual:, предупреждения исчезли.

Так что, если вы следуете этим примерам, вам, вероятно, следует сделать следующее:

if ([[[obj1 objectID] URIRepresentation] isEqual:[[_obj2 objectID] URIRepresentation]] {
    NSLog(@"Match");
}
7 голосов
/ 16 января 2013

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

...