Как Сортировать NSMutableArray Управляемых Объектов через граф объекта - PullRequest
12 голосов
/ 28 августа 2009

Я новичок в поддержке Apple iPhone 3.0 SDK для Core Data, и я относительно новичок в разработке для iPhone. Мой вопрос касается немного более "сложной" сортировки, чем описано в документации. Я подозреваю, что я делаю неправильное, фундаментальное предположение.

Как отсортировать предварительно выбранную коллекцию управляемых объектов по свойству, содержащему несколько уровней глубже в коллекции?

Пример: Ферма имеет 1 ко многим Ковбой (Farm.cowboys) Ковбой имеет 1 к 1 на человека (Cowboy.person) Персона имеет фамилию (Person.lastName)

Весь граф объектов был выбран, и ковбои отображаются через UITableView. Теперь, как мне отсортировать Ковбоев по lastName? Нужно ли мне их повторно? и если да, как мне сделать это с помощью вложенной сортировки?

В настоящее время я пытаюсь отсортировать NSMutableArray из ковбоев ([Farm.cowboys allobjects]), который подходит для этих свойств в Cowboy. Но я не уверен, как заставить это работать при сортировке коллекции Cowboys по Cowboy.person.lastName?

Ответы [ 4 ]

21 голосов
/ 02 сентября 2009

Если вы можете нацелиться на 10,6, вы можете сделать это, используя блоки. Вот так:

- (NSArray *)sortedArray {
    return [originalArray sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2){
    NSString *lastName1 = [[obj1 person] lastName];
    NSString *lastName2 = [[obj2 person] lastName];
    return [lastName1 caseInsensitiveCompare:lastName2]; }];
}
5 голосов
/ 20 июня 2011

Вы можете сортировать так:

[myUnsortedArrayOfCowboys sortedArrayUsingDescriptors:
    [NSArray arrayWithObject:
        [NSSortDescriptor
            sortDescriptorWithKey:"person.lastName"
            ascending:YES]]];

Обратите внимание на '.' в ключе дескриптора сортировки. Вот как вы проходите граф объекта.

1 голос
/ 17 августа 2011

Если вы хотите отсортировать число и строку, используйте это

NSArray *unsortedArray = [NSArray arrayWithObjects:@"Hello", @"4", @"Hi", @"5", @"2", @"10", @"1", nil];
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id firstObject, id secondObject) {
    return [((NSString *)firstObject) compare:((NSString *)secondObject) options:NSNumericSearch];
}];
0 голосов
/ 02 сентября 2009

Надеюсь, у кого-то есть лучшее решение. Однако ....

Работает объект-оболочка с селектором сравнения и ссылкой на объект сортировки. Это не так чисто, как хотелось бы, надеюсь, кто-то другой предложит альтернативу.

По сути, CowboyWrapper обладает свойством ковбоя. CowboyWrapper также имеет селектор сравнения. Создавая и поддерживая синхронизацию NSMutableArray из CowboyWrappers, сортировка работает.

...