Сортировка NSSet объектов NSManagedObject по атрибуту

Учитывая NSSet, который содержит объекты подкласса NSManagedObject со строковым атрибутом name, как я могу отсортировать набор по имени? Это где я использовал бы NSPredicate?

Спасибо!

Ответ 1

Нет, но вы должны использовать NSSortDescriptor.

Вы должны использовать метод sortedArrayUsingDescriptors: следующим образом:

NSSortDescriptor *nameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *sorted = [yourSet sortedArrayUsingDescriptors:[NSArray arrayWithObject:nameDescriptor]];

Ответ 2

Упомянув NSPredicate, мне кажется, что OP хочет сортировать набор как часть выполненной выборки. Имел ли он в виду это или нет, вот пример этого. Скажем, у вас есть много обратных отношений между сущностью Employee и подразделением, т.е. Отдел содержит много сотрудников. Учитывая, что вы уже получили отдел, зачислите сотрудников в отдел и отсортируйте их по имени:

Использование MagicalRecord:

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

Без 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];