Re: NSSortDescriptor and Block
Re: NSSortDescriptor and Block
- Subject: Re: NSSortDescriptor and Block
- From: Jochen Moeller <email@hidden>
- Date: Wed, 24 Mar 2010 11:55:02 +0100
Hello Ben,
thanks very much for your answer. Your idea with the nil keypath works!
So changing the line in question to:
NSSortDescriptor *descr3 = [ NSSortDescriptor sortDescriptorWithKey:nil ascending:YES
comparator:^NSComparisonResult(id obj1, id obj2) {
is sorting the array without claims.
The syntax of that method is a bit confusing. When using a selector the key is required, and when using a comparator it is not.
Thanks again,
Jochen Moeller
Am 24.03.2010 um 11:12 schrieb Ben Trumbull:
>> while experimenting with sorting methods I got a strange error message with
>> -sortDescriptorWithKey:ascending:comparator:.
>>
>> In the following listing (as simple as possible) an Array can be sorted with
>> -sortedArrayUsingDescriptors: with a selector, and
>> -sortedArrayUsingComparator:
>>
>> But -sortedArrayUsingDescriptors: with a comparator results in
>> Error: -[NSCFNumber rx]: unrecognized selector.
>>
>> So the method expects the key "rx" not in my class as it should but in the NSNumber class.
>> A bug? Or is something wrong in my approach?
>
> The arguments to the Block with the NSSortDescriptor are the results of calling valueForKeyPath, not the original objects in the array. NSSortDescriptor has already pulled the values for the keypaths out and caches them. So your using the key @"rx" with that block is like:
>
> [[obj1 valueForKeyPath:@"rx"] rx]
>
> If you don't want NSSortDescriptors KVC functionality, you can just use -sortedArrayUsingComparator:. You can also try a nil keypath, although I'm not certain that works.
>
> - Ben
>
>> // Sort array with -sortDescriptorWithKey:ascending:comparator:
>> // Error: -[NSCFNumber rx]: unrecognized selector
>> NSSortDescriptor *descr3 = [ NSSortDescriptor sortDescriptorWithKey:@"rx" ascending:YES
>> comparator:^NSComparisonResult(id obj1, id obj2) {
>> if ([obj1 rx] < [obj2 rx]) { return NSOrderedAscending; }
>> else if ([obj1 rx] > [obj2 rx]) { return NSOrderedDescending; }
>> return NSOrderedSame;
>> }];
>
>
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden