Как сортировать 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?
Ответы
Ответ 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, сортировка выполняется.