iphone - online - Ordenando aMucha relación Establecer en datos centrales
iphone 7 (6)
Debe definir su propio método, como sortedWorkers. Algo como esto:
- (NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
return [self.workers sortedArrayUsingDescriptors:sortDescriptors];
}
Tengo dos modelos Departamento y Trabajador. Los departamentos tienen muchas relaciones (trabajadores) con los trabajadores. El trabajador tiene el campo firstName. ¿Cómo puedo obtener una lista de trabajadores clasificada por firstName accediendo a departmet.workers? ¿Hay alguna manera de agregar descriptores de ordenamiento en la relación de muchos?
El recorte de código de Hunter casi funcionó para mí, excepto porque "workers" es un NSSet, primero tuve que cargarlo en un NSMutableArray:
- (NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
NSMutableArray *sortThese = [NSMutableArray arrayWithCapacity:[self.workers count]];
for (id worker in self.workers) {
[sortThese addObject:worker];
}
return [sortThese sortedArrayUsingDescriptors:sortDescriptors];
}
Mejora menor sobre el código de Adrian Hosey:
En lugar de iterar manualmente sobre todos los trabajadores, también puede hacer lo siguiente:
-(NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
return [self.workers sortedArrayUsingDescriptors:sortDescriptors];
}
Probablemente hace exactamente lo mismo que su iteración internamente, pero tal vez lo hicieron más eficiente de alguna manera. Ciertamente es menos tipeado ...
Nota: lo anterior solo funciona en iOS 4.0+ y OSX 10.6+. En versiones anteriores, debe reemplazar la última línea por:
return [[self.workers allObjects] sortedArrayUsingDescriptors:sortDescriptors];
Mejora menor sobre la solución de Adrian Schönig:
Por ahora, es necesario self.workers
a NSSet *
-(NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
return [(NSSet*)self.workers sortedArrayUsingDescriptors:sortDescriptors];
}
Noté que esto es bastante viejo, pero la gente aún lo encontrará (lo hice)
La publicación de Adrian Schönig fue buena. Lo encontré útil para los conceptos básicos, pero debe hacer este tipo cada vez que desee acceder al Conjunto de trabajadores. Esto es muy ineficiente!
En cambio, lo mejor es hacer el ordenamiento cada vez que insertas un objeto nuevo y luego guardarlo como el Conjunto en CoreData. Esto significa que cada vez que llame a CoreData se ordenará a los trabajadores.
Hice esto para mi sistema usando una Categoría para NSManagedObject (Worker + Methods.h). Aquí tengo el método init para un nuevo trabajador
// Worker+Methods.m
+(Worker *)newWorkerWithFirstname:(NSString *)firstName department:(Department *)department managedContext:(NSManagedObjectContext *)context {
Worker *w = [NSEntityDescription insertNewObjectForEntityForName:@"Worker" inManagedObjectContext:context];
w.firstName = firstName;
w.department = department;
[department orderWorkers];
return s;
}
//Department+Methods.m
-(void)orderServices {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
self.workers = [[NSSet alloc] initWithArray:[self.workers sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortNameDescriptor]]];
}
Obviamente, esto es ineficiente cuando agrega muchos Trabajadores, pero solo puede mover [department orderWorkers]; que suceda después de que se agreguen todos los trabajadores.
Para muchas relaciones en Core Data se modelan como conjuntos desordenados. Sin embargo, puede crear una propiedad captada en la entidad del Departamento que incluya un descriptor de clasificación o puede ordenar el conjunto en memoria dentro de su aplicación ( NSArrayController
hará esto por usted configurando su propiedad sortDescriptors
).