Подтвердить что ты не робот

Как сортировать NSMutableArray управляемых объектов через граф объектов

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

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

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

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

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

4b9b3361

Ответ 1

Если вы можете настроить таргетинг 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]; }];
}

Ответ 2

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

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

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

Ответ 3

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

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];
}];

Ответ 4

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

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

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