10

tengo una matriz no ordenada con las instancias de la clase siguiente:clasificación con sortedArrayUsingDescriptors y rutas clave

@interface Place : NSObject { 

} 

@property (nonatomic, copy) NSString *country; 
@property (nonatomic, copy) NSString *city; 
@property (nonatomic, retain) NSURL *imageURL; 


-(id) initWithCountry: (NSString *) aCountry city: (NSString *) aCity imageUrl: (NSURL *) aUrl; 


@end 

y yo estoy tratando de solucionar el problema con sortedArrayUsingDescriptors por país y ciudad. La documentación para NSSortDescriptor dicen que el arg de initWithKey: es una Ruta de la clave.

Sin embargo, si intento utilizar un NSortDescriptor tales como:

NSSortDescriptor *country = [[[NSSortDescriptor alloc] initWithKey:@"country.city" ascending:YES]autorelease]; 

Me aparece un error:

NSMutableSet *bag = [[[NSMutableSet alloc] init] autorelease]; 
[bag addObject:[[Place alloc] initWithCountry:@"USA" 
             city:@"Springfield" 
            imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]]; 
[bag addObject:[[Place alloc] initWithCountry:@"Afghanistan" 
             city:@"Tora Bora" 
            imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]]; 
[bag addObject:[[Place alloc] initWithCountry:@"USA" 
             city:@"Chicago" 
            imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]]; 

[bag addObject:[[Place alloc] initWithCountry:@"USA" 
             city:@"Chicago" 
            imageUrl:[NSURL URLWithString:@"http://www.google.com"]]]; 


NSSortDescriptor *sort = [[[NSSortDescriptor alloc] initWithKey:@"country.city" ascending:YES]autorelease]; 
NSArray *sorted = [bag sortedArrayUsingDescriptors:[NSArray arrayWithObjects: sort, nil]]; 

* Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSCFString 0x6ae8> valueForUndefinedKey:]: this class is not key value coding-compliant for the key city.'

¿Puedo utilizar una ruta de la clave o no? ¿Qué estoy haciendo mal?

+0

Tenga en cuenta que un 'NS (mutable) Set' no es una bolsa. Si quieres una bolsa real, es decir, una colección donde se puede poner más de uno de cada elemento, utilice 'NSCountedSet', que siempre es mutable. – fzwo

Respuesta

28

Es posible que desee utilizar este:

NSSortDescriptor *country = [[[NSSortDescriptor alloc] initWithKey:@"country" ascending:YES]autorelease]; 
NSSortDescriptor *city = [[[NSSortDescriptor alloc] initWithKey:@"city" ascending:YES]autorelease]; 
NSArray *sorted = [bag sortedArrayUsingDescriptors:[NSArray arrayWithObjects: country, city, nil]]; 

La matriz que se pasa a sortedArrayUsingDescriptors: define las prioridades clave de clasificación. Los descriptores ordenar proporcionan las keypaths para comparar (y el orden deseado: ascendente/descendente).

Un descriptor especie de "country.city" pedirá a cada lugar por su país y luego como el país devuelto (que es un NSString) para su ciudad. Y todos sabemos que NSString no es el valor de codificación compatible para la ciudad clave;)

que había necesidad de un descriptor de tipo de "country.city" si sus Place casos tenían una propiedad country, que a su vez tenían una propiedad city.