2010-03-15 15 views
6

Supongamos que tengo una entidad principal, cada una de las cuales tiene un número de hijos. Quiero ordenar a todos los padres por su número de hijos. Algo similar a lo siguiente pseudo código:Datos principales: Clasificación de NSFetchRequest por recuento de la relación de muchos

NSEntityDescription * entity = [NSEntityDescription entityForName:@"Parent" inManagedObjectContext:managedObjectContext]; 

[[NSSortDescriptor alloc] initWithKey:@"children.count" ascending:NO]; 
//Execute request 

¿Hay una manera de construir una zona de alcance como esto utilizando datos básicos? Si no hay forma de hacerlo, ¿se sortearán usando sortedArrayUsingSelector: y se perderán los beneficios del tamaño del lote _PFBatchFaultingArray?

Gracias, Ben

Respuesta

5

Su consulta funcionaría, pero (suponiendo children está en fallo), usaría la clave-valor de los métodos de codificación en la propiedad children, que a su vez disparar el fallo (véase the NSManagedObject docs para una lista de métodos que disparan fallas, y una discusión de este comportamiento), por lo que perdería los beneficios de rendimiento de los lotes y fallas.

Puede considerar mantener un atributo derivado en su entidad padre (llámelo childrenCount) que refleje la cantidad de hijos relacionados con el padre, si esto es factible para su situación. No es la solución más limpia, pero si la mantiene como un NSNumber en la entidad padre, usted tendría acceso a ella aunque children tenga una falla, y puede ordenarla directamente.

+1

El KVC '@ count' se realizaría en el' NSSet' no en los objetos dentro de ese 'NSSet' y, por lo tanto, no provocaría el disparo de los fallos. –

+0

Hace que se active la falla, ya que Core Data no falla cada objeto individualmente - falla el conjunto mismo (o más bien, una subclase concreta de NSSet). Consulte http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html#//apple_ref/doc/uid/TP30001202, en "Faulting Limits the Size of the Object Graph". . – Tim

+3

¿Han cambiado las cosas desde entonces? iOS 7 arroja una excepción para este tipo de clasificación: *** Aplicación de finalización debido a la excepción no detectada 'NSInvalidArgumentException', razón: 'no se permite ninguna clave aquí' *** Pila de la primera llamada: – an0

Cuestiones relacionadas