Приоритеты NSSortDescriptor

Я использую NSSortDescriptor для сортировки контактов с именем firstName, но если имя равно nil, сортировка будет неправильной.

если бы у меня был:

контакт 1: Имя = BAAAA и Фамилия = XXXXXX

контакт 2: Имя = nil и Фамилия = AAAAAA

типа это будет так.

1- АААААА

2- БАААА ХХХХХ

поэтому мне нужно знать, существует ли решение для установления приоритетов между именем и фамилией.

если Firstname ==nil так бери фамилию

Спасибо


person Bacem    schedule 15.11.2013    source источник


Ответы (2)


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

порядок дескрипторов в массиве определяет приоритет. Для основного запроса данных это будет что-то вроде

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...
}
person jbat100    schedule 15.11.2013
comment
Спасибо за ответ. Но как я могу это сделать, если я хочу создать запрос на выборку (основные данные) с помощью NSSortDescriptors. Это сортировка массива, а не запрос на выборку. - person Bacem; 15.11.2013

Вы можете создать подкласс NSSortDescriptor и переопределить метод compareObject:toObject::

- (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];
}
person nst    schedule 15.11.2013