2010-12-16 3 views
10

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

Спасибо!

+2

поправьте меня, если я неверно, но я считаю, что `NSSet` является неупорядоченным, то есть содержащиеся в нем элементы не имеют особого порядка (концептуально говоря), что означает, что` NSSet` не может быть отсортирован. Вы можете поместить объекты в `NSArray`, который упорядочен и может быть отсортирован. – filipe 2010-12-16 21:34:45

+1

Похоже, это то, о чем спрашивает OP ... – 2010-12-16 21:39:26

ответ

33

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

Вы бы использовать sortedArrayUsingDescriptors: метод, как это:

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

Спасибо! Должны ли они быть выпущены для управления памятью? – 2010-12-16 21:44:34

5

Упоминая NSPredicate, я чувствую, как будто ОП хотел, чтобы отсортировать набор как часть казненных выборки. Имел ли он в виду это или нет, вот пример этого. Скажем, у вас есть много обратных отношений между сущностью 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]; 
Смежные вопросы