2011-07-21 11 views
6

¿Es posible utilizar objetos CLLocation como claves en un diccionario? Cuando intento esto, el [dictionary objectForKey: clLocationObj] siempre devuelve nil incluso cuando ya hay claves CLLocation insertadas con exactamente la misma latitud y longitud. ¿Qué podría estar haciendo mal?utilizando objetos CLLocation como claves en el diccionario de

 for (Location *location in someArray) { 
       CLLocation *locationKey = [[CLLocation alloc] initWithLatitude:[location.latitude doubleValue] longitude:[location.longtitude doubleValue]]; 
       LocationAnnotation *annotationAtLocation = [self.uniqueLocations objectForKey:locationKey]; 
       if (annotationAtLocation == nil) 
        NSLog(@"this is always nil"); 
     } 

Sé por depuración que hay varios objetos de ubicación con la misma latitud y longitud en someArray.

Respuesta

6

CLLocation no parece anular isEqual para realizar una comparación de contenido real, sino que compara la igualdad en función de la identidad del objeto. Por lo tanto es aconsejable no de utilizarlo como una clave en un diccionario, a menos que siempre está accediendo a ella con el mismo objeto exacto.

La solución que ha descrito en un comentario es bastante buena solución para muchas situaciones:

terminé convertir el objeto en un CLLocationCoordinate2DNSValue y se utiliza que a medida que la clave para el diccionario.

2

es totalmente permitido utilizar CLLocation como claves para un diccionario, no hay problema con eso. La razón por la que recibe nil se debe a que ningún valor se asocia con la llave, comprobar dónde se llena el diccionario.

Sobre sus claves múltiplos CLLocation, cada vez que configura un objeto para una clave que ya existe en el diccionario, el valor anterior recibirá un mensaje release, y el nuevo tomará su lugar. Por lo tanto, si tiene varias ubicaciones para almacenar y otras son iguales, debe buscar otro tipo como la clave del diccionario.

+0

los solucionaron eso? –

+1

Lo hice de otra manera. La razón por la que CLLocation no me funcionaba bien es que tiene más información que solo lat/long, por lo que comparar 2 CLLocations con la misma latitud/longitud no va a dar lugar a una coincidencia. Terminé convirtiendo el objeto CLLocationCoordinate2D en un NSValue y lo usé como la clave del diccionario. –

5

Hay NSValueMapKitGeometryExtensions categoría en NSValue en marco MapKit

//to set 
NSValue *locationValue = [NSValue valueWithMKCoordinate:location.coordinate]; 
[dictionary setObject:object forKey:locationValue]; 

//to get 
NSValue *coordinateValue = dictionary[locationValue]; 
CLLocationCoordinate2D coordinate = [coordinateValue MKCoordinateValue]; 
Cuestiones relacionadas