Сортировка с помощью sortedArrayUsingDescriptors и ключевых путей - PullRequest
10 голосов
/ 06 апреля 2011

У меня есть неупорядоченный массив с экземплярами следующего класса:

@interface Place : NSObject {

}

@property (nonatomic, copy) NSString *country;
@property (nonatomic, copy) NSString *city;
@property (nonatomic, retain) NSURL   *imageURL;


-(id) initWithCountry: (NSString *) aCountry city: (NSString *) aCity imageUrl: (NSURL *) aUrl;


@end

и я пытаюсь отсортировать его с помощью sortedArrayUsingDescriptors по стране и городу. Документы для NSSortDescriptor говорят, что аргумент initWithKey: является ключевым путем.

Однако, если я пытаюсь использовать NSortDescriptor, такой как:

NSSortDescriptor *country = [[[NSSortDescriptor alloc] initWithKey:@"country.city" ascending:YES]autorelease];

Я получаю ошибку:

NSMutableSet *bag = [[[NSMutableSet alloc] init] autorelease];
[bag addObject:[[Place alloc] initWithCountry:@"USA" 
                                         city:@"Springfield" 
                                     imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]];
[bag addObject:[[Place alloc] initWithCountry:@"Afghanistan" 
                                         city:@"Tora Bora" 
                                     imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]];
[bag addObject:[[Place alloc] initWithCountry:@"USA" 
                                         city:@"Chicago" 
                                     imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]];

[bag addObject:[[Place alloc] initWithCountry:@"USA" 
                                         city:@"Chicago" 
                                     imageUrl:[NSURL URLWithString:@"http://www.google.com"]]];


NSSortDescriptor *sort = [[[NSSortDescriptor alloc] initWithKey:@"country.city" ascending:YES]autorelease];
NSArray *sorted = [bag sortedArrayUsingDescriptors:[NSArray arrayWithObjects: sort, nil]];

* Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: '[ valueForUndefinedKey:]: этот класс не кодирование значения ключа для Ключевой город. '

Могу ли я использовать ключевой путь или нет? Что я делаю не так?

1 Ответ

30 голосов
/ 06 апреля 2011

Вы можете использовать это:

NSSortDescriptor *country = [[[NSSortDescriptor alloc] initWithKey:@"country" ascending:YES]autorelease];
NSSortDescriptor *city = [[[NSSortDescriptor alloc] initWithKey:@"city" ascending:YES]autorelease];
NSArray *sorted = [bag sortedArrayUsingDescriptors:[NSArray arrayWithObjects: country, city, nil]];

Массив, который передается в sortedArrayUsingDescriptors:, определяет приоритеты ключа сортировки.Дескрипторы сортировки предоставляют ключевые пути для сравнения (и требуемый порядок: возрастание / убывание).

Дескриптор сортировки «country.city» будет запрашивать каждое место для своей страны, а затем в качестве возвращаемой страны (которая являетсяNSString) для своего города.И все мы знаем, что NSString не соответствует кодировке значений для ключевого города;)

Вам понадобится дескриптор сортировки "country.city", если у ваших Place экземпляров есть свойство country, которое само по себеимел свойство city.

...