2011-11-30 4 views
6

Hihi todo,iPhone - Clasificación de NSMutableArray contiene NSDictionary con 2 llaves

Tengo una NSMutableArray que contiene varios NSDictionary. En cada uno de los NSDictionary, tengo dos pares clave-valor, por ejemplo: nombre de usuario y fecha de inicio de sesión.

Necesitaría ordenar todo NSDictionary en este NSMutableArray basado en loginDate descendente y nombre de usuario ascendente.

Sólo para ilustrar con más detalle:

NSMutableArray (index 0): NSDictionary -> username:"user1", loginDate:20 Dec 2011 
NSMutableArray (index 1): NSDictionary -> username:"user2", loginDate:15 Dec 2011 
NSMutableArray (index 2): NSDictionary -> username:"user3", loginDate:28 Dec 2011 
NSMutableArray (index 3): NSDictionary -> username:"user4", loginDate:28 Dec 2011 

Después de la clasificación, el resultado de la matriz debe ser:

NSMutableArray (index 0): NSDictionary -> username:"user3", loginDate:28 Dec 2011 
NSMutableArray (index 1): NSDictionary -> username:"user4", loginDate:28 Dec 2011 
NSMutableArray (index 2): NSDictionary -> username:"user1", loginDate:20 Dec 2011 
NSMutableArray (index 3): NSDictionary -> username:"user2", loginDate:15 Dec 2011 

¿Cómo puedo lograr esto? He pasado por el método sortUsingComparator, no puedo encontrar la forma de hacerlo.

+0

¿Está loginDate una cadena o es un NSDate? –

+0

Es un NSDate. –

Respuesta

6

Tal vez algo como esto?

[array sortUsingDescriptors: 
[NSArray arrayWithObjects: 
    [[[NSSortDescriptor alloc] 
    initWithKey:@"loginDate" 
    ascending:NO] 
    autorelease], 
    [[[NSSortDescriptor alloc] 
    initWithKey:@"username" 
    ascending:YES] 
    autorelease], 
    nil]]; 

Si se construye para iOS 4 o superior incluso se puede hacer:

[array sortUsingDescriptors: 
[NSArray arrayWithObjects: 
    [NSSortDescriptor sortDescriptorWithKey:@"loginDate" ascending:NO], 
    [NSSortDescriptor sortDescriptorWithKey:@"username" ascending:YES], 
    nil]]; 

Esto funciona mediante el método compare: para comparar los valores clave de la propiedad, que es el valor devuelto por valueForKey:. En el caso de NSDictionary, simplemente llamará al objectForKey: para obtener el valor. Hay algunas anotaciones especiales, como el prefijo del nombre de la tecla con "@", ver Difference valueforKey objectForKey para obtener más detalles.

+0

Gracias por el consejo, sin duda lo probará y los comentarios de nuevo ... :) –

+0

Esto ordenará usando el selector 'compare:' para cada tecla. También puede especificar otro selector o utilizar un comparador personalizado para cada descriptor de ordenación si lo desea. –

+0

¡Muchas gracias! ¡Funciona! :) –

Cuestiones relacionadas