2010-12-16 11 views
10

Dado un NSSet que contiene objetos que son una subclase NSManagedObject con un atributo de cadena denominado name, ¿cómo puedo ordenar el conjunto por nombre? ¿Es aquí donde usaría un NSPredicate?Ordenar un NSSet de NSManagedObjects por el atributo

Gracias!

+2

me corrija si estoy Estoy equivocado, pero creo que 'NSSet' no está ordenado, lo que significa que los elementos contenidos no están en un orden particular (conceptualmente hablando), lo que significa que un' NSSet' no puede ser ordenado. Puede colocar los objetos en un 'NSArray', que se ordena y se puede ordenar. – filipe

+1

Parece que esto es lo que el OP está pidiendo ... –

Respuesta

33

No, pero usaría un NSSortDescriptor.

tendrá que utilizar el método sortedArrayUsingDescriptors: así:

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

¡Gracias! ¿Tendrían que ser liberados para la gestión de la memoria? –

+0

@Bill La matriz 'ordenada' se libera automáticamente, por lo que no. –

+0

y si creo NSSet del NSArray ordenado por \t NSSet (array: <# [AnyObject] #>)), ¿mantendrá el orden? – BaSha

5

Al mencionar NSPredicate, me siento como si el PO quería para ordenar el conjunto como parte de la ejecución captación. Si él quiso decir esto o no, aquí hay un ejemplo de esto. Supongamos que tiene una relación mutua inversamente proporcional entre una entidad de empleado y una entidad de departamento, es decir, un departamento contiene muchos empleados. Dado que has tomaron la departamento ya, ir a buscar a los empleados en el departamento y ordenarlos por nombre:

Usando MagicalRecord:

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

Sin 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]; 
+0

MagicalRecord ??? –

+0

MagicalRecord: https://github.com/magicalpanda/MagicalRecord. OP realmente debería haber señalado esto como una solución de terceros. – Demitri

Cuestiones relacionadas