Prioridades de NSSortDescriptor

Uso NSSortDescriptor para ordenar los contactos con firstName, pero si el primer nombre es nulo, la clasificación será incorrecta.

si tengo:

contacto 1: Nombre = BAAAA y Apellido = XXXXXX

contacto 2: Nombre = nil y Apellido = AAAAAA

el tipo será así.

1- AAAAAAA

2- BAAAAA XXXXXX

entonces necesito saber si existe una solución para establecer prioridades entre Firstname y LastName.

if Firstname ==nil así que toma Apellido

Muchas Gracias

preguntado el 15 de noviembre de 13 a las 08:11

2 Respuestas

NSSortDescriptor *descriptor1 = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
NSSortDescriptor *descriptor2 = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES];
NSArray *sorted = [contatcs sortedArrayUsingDescriptors:@[descriptor1, descriptor2]];

el orden de los descriptores en la matriz determina la prioridad. Para una consulta de datos básicos, sería algo así como

NSManagedObjectContext *moc = [self managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:moc];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];

[request setSortDescriptors:@[descriptor1, descriptor2]];

NSError *error;
NSArray *array = [moc executeFetchRequest:request error:&error];
if (array == nil)
{
    // Deal with error...
}

respondido 15 nov., 13:08

Gracias por la respuesta. Pero, ¿cómo puedo hacerlo si quiero crear una solicitud de recuperación (datos básicos) con NSSortDescriptors? Esta es una ordenación de matriz, no una solicitud de recuperación. - Bastardo

Puedes subclasificar NSSortDescriptor y anular el compareObject:toObject: método:

- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2 {
    NSString *firstName1 = [object1 valueForKey:@"firstName"];
    NSString *lastName1 = [object1 valueForKey:@"lastName"];

    NSString *firstName2 = [object2 valueForKey:@"firstName"];
    NSString *lastName2 = [object2 valueForKey:@"lastName"];

    if(firstName1 == nil || firstName2 == nil) {
        return [lastName1 compare:lastName2];
    }

    return [firstName1 compare:firstName2];
}

respondido 15 nov., 13:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.