Chris Sanderson
Chris Sanderson

Reputation: 115

Sorting arrays in Objective-C

I'm currently trying to teach myself Objective-C and was playing around with an exercise where I needed to sort an array.

I managed to complete it using the following code:

NSSortDescriptor * newSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:TRUE];
NSArray *sortDescriptors = [NSArray arrayWithObject:newSortDescriptor];
[self.theBookStore sortUsingDescriptors:sortDescriptors];

My question is about what is actually happening here. I don't really understand exactly what I've done.

Line 1: I understand here I've created a new object that has a descriptor. This has two parameters, the column I want to sort on and that it is ascending.

Line 2: This is the line I'm confused about. Why do I need an array of sort descriptors? When I read this code I suspect it creates an array with only one row is that correct?

Line 3: I understand that this is calling the sortUsingDescriptors method but again, my confusion is why this function expects an array.

I've read the documentation but I'm really looking for a simple explanation.

Any help is much appreciated

Upvotes: 3

Views: 706

Answers (3)

Caleb
Caleb

Reputation: 125037

Line 1: I understand here I've created a new object that has a descriptor. This has two parameters, the column I want to sort on and that it is ascending.

Really, you've created an object that is a descriptor. It describes how to sort the array.

Line 2: This is the line I'm confused about. Why do I need an array of sort descriptors? When I read this code I suspect it creates an array with only one row is that correct?

Right -- you've created an array that contains a single object. You could create an array that has ten or fifteen or eighty-seven sort descriptors, if you really wanted to sort on that many fields. More often, you use one, two, maybe three. So, if you're sorting a list of people, you might add sort descriptors that specify last name and first name. That way, people that have the same last name will be arranged within that group according to their first name.

Line 3: I understand that this is calling the sortUsingDescriptors method but again, my confusion is why this function expects an array.

Again, it's so that you can have primary, secondary, tertiary (etc.) sort keys. You could have a separate method that takes a single sort descriptor instead of an array for those times when you want to sort on only one key. NSArray doesn't provide that, but you can always add it in a category if you want:

@category NSArray (SingleSortDescriptor)

- (NSArray*)sortUsingDescriptor:(NSSortDescriptor*)descriptor;

@end

@implementation NSArray (SingleSortDescriptor)

- (NSArray*)sortUsingDescriptor:(NSSortDescriptor*)descriptor
{
    return [self sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];
}

@end

Upvotes: 5

Phillip Mills
Phillip Mills

Reputation: 31026

Multiple sort descriptors would be used to resolve what happens if there are multiple matches. I's a priority order. A second descriptor would tell it what to do if it found two titles the same.

Upvotes: 1

Jonas Schnelli
Jonas Schnelli

Reputation: 10005

  • Line 1: .. yes your right. You are creating a custom object called NSSortDescriptor. That object defines a attribute to sort after. You did enter "title". So the objects in your array-to-sort will be sorted after that property (yourObject.title "kind-of").

  • Line 2: Because the sorting method (sortUsingDescriptors) always needs a array, you need to create a NSArray with only one object. Okay, ... looks kind of stupid. But makes absolute sense. Lets say you would like to sort after two criteria (lets say "title", then "city").

  • Line 3: Yes heres must be a array because of sorting after more then one criteria.

And always keep the memory clean: On line 1 you did allocate/init a NSSortDescriptor. So clean up after using it (if you are not using ARC). So add a line:

[newSortDescriptor release];

Upvotes: 2

Related Questions