使用sortedArrayUsingDescriptors和Key Paths排序

时间:2011-04-05 20:00:46

标签: objective-c cocoa sorting key-value-observing nssortdescriptor

我有一个带有以下类实例的无序数组:

@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的arg是一个关键路径。

但是,如果我尝试使用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'而终止应用,   原因:'[< NSCFString 0x6ae8>   valueForUndefinedKey:]:这个类是   不符合关键值编码   重点城市。'

我可以使用密钥路径吗?我做错了什么?

1 个答案:

答案 0 :(得分:30)

您可能想要使用它:

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的排序描述符。