2011-01-19 23 views
21

Tengo un código que recorre una matriz de NSManagedObjects y se detiene cuando encuentra un determinado registro que está almacenado en una variable de instancia. La única forma en que puedo ver si son el mismo registro (no un registro equivalente, el registro específico) es comparando las representaciones URIR de los objectID. Esta seguramente no puede ser la mejor manera de hacerlo. Que estoy haciendo:Comparación de dos objetos NSManagedObjects

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

El siguiente código no coincide, incluso cuando NSLog los ObjectID y veo que en realidad son exactamente lo mismo.

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

En esta situación, llamar isEqualTo: es lo mismo que [obj1 objectID] == [obj2 objectID] porque NSManagedObjectID no anula isEqual :. Debería recibir exactamente el mismo objeto de ambas llamadas para que devuelva SÍ. – ughoavgfhw

Respuesta

19

El comentarista es correcta, isEqualTo: no funcionará en este caso, ya que son diferentes instancias de NSManagedObjectID.

La forma en que lo hace es la mejor manera, el ID de objeto es el identificador único de CoreData para un objeto administrado dado, es la única forma de saber si dos instancias de NSManagedObject apuntan al mismo registro en el almacén persistente.

12

Aclaración:

ImHuntingWabbits se refiere a isEqual:, pero luego informa a Nick a seguir con su primer ejemplo, que en realidad utiliza isEqualTo:.

Por el comentario de Peter Hosey al post isEqual vs isEqualTo, hay una diferencia y es mejor que utilices isEqual:.

Siguiendo las publicaciones actuales, utilicé originalmente isEqualTo: para comparar las URL objectID, que funcionaban bien en Cocoa, pero cuando cambié este código a iOS, recibí advertencias de que "NSURL puede no responder a isEqualTo". Cuando cambié a isEqual:, las advertencias desaparecieron.

Así que si usted está siguiendo estos ejemplos, probablemente debería hacer esto:

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

En realidad, él todavía quiere usar isEqual y solo los ID de objeto. El uso de la Representación de URI es mucho más lento. – ImHuntingWabbits

6

-isEqual: se ha implementado correctamente para NSManagedObjectID en CoreData. Usamos colecciones con -contains: todo el tiempo. Parece que el cartel original confundió -isEqual: con -isEqualTo: este último no debería usarse.

+0

"usarlo todo el tiempo" es un buen argumento. :-) – Andy

Cuestiones relacionadas