Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sorting a NSSet of NSManagedObjects by attribute

Given an NSSet that contains objects that are a subclass NSManagedObject with a string attribute called name, how can I sort the set by name? Is this where I would use an NSPredicate?

Thank you!

like image 951
Bill Shiff Avatar asked Dec 16 '10 21:12

Bill Shiff


2 Answers

No, but you'd use an NSSortDescriptor.

You'd use the sortedArrayUsingDescriptors: method like this:

NSSortDescriptor *nameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *sorted = [yourSet sortedArrayUsingDescriptors:[NSArray arrayWithObject:nameDescriptor]];
like image 136
Jacob Relkin Avatar answered Nov 15 '22 20:11

Jacob Relkin


By mentioning NSPredicate, I feel as though the OP wanted to sort the set as part of the executed fetch. Whether he meant this or not, here is an example of this. Say you have a to-many inverse relationship between an Employee entity and a Department entity i.e. a department contains many employees. Given you've fetched the department already, fetch the employees in the department and sort them by first name:

Using MagicalRecord:

Department *department = someFetchedDepartment; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"department == %@", department];
NSArray *sortedEmployees = [Employee MR_findAllSortedBy:@"firstName" ascending:YES withPredicate:predicate];

Without MagicalRecord:

NSFetchRequest *request = [[NSFetchRequest alloc] init];    

NSEntityDescription *employeeEntity = [NSEntityDescription @"Employee" inManagedObjectContext:self.context];
[request setEntity:employeeEntity];

Department *department = someFetchedDepartment; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"department == %@", department];
[request setPredicate:predicate];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:ascending];
[request setSortDescriptors:@[sortDescriptor]];

NSError *error = nil;
NSArray *sortedEmployees = [self.context executeFetchRequest:request error:&error];
like image 31
David Robles Avatar answered Nov 15 '22 18:11

David Robles