2012-09-28 39 views
21

A-Muchas relaciones en la base de datos están representadas por NSSet (como se generan de forma automática mediante el editor ... Crea NSManagedObject Subclase .. menú.Cómo iterar un NSSet (Objective-C) - Representación de la relación To-Many en Core Data - de manera eficiente?

¿Cuál es la forma más eficiente para recorrer una NSSet *?

NSSet* groups = [contact groups]; 
for(Group* group in groups) { 
    NSString* groupName = [group name]; 
} 

o

NSSet* groups2 = [contact groups]; 
NSArray* groupsArray = [groups2 allObjects]; 
for(Group* group in groupsArray) { 
    NSString* groupName = [group name]; 
} 

o de otra manera?

+0

Esta página: http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html dice que iterar a través de un NSArray es mucho más rápido que NSSet, 0.004713 segundos frente a 0.025864 segundos. – ikevin8me

Respuesta

18

La primera es probablemente más eficiente. Si t este último era más eficiente que Apple simplemente usaría esa ruta para implementar el primero.

Dicho esto, si lo preguntas porque el rendimiento parece ser un problema, es más probable que estés gastando mucho tiempo en los datos de Core Data de los objetos con fallas. Un movimiento inteligente sería hacer una búsqueda en self in %@ con groups; establezca returnsObjectsAsFaults de solicitud de recuperación en NO y asegúrese de que se haya especificado relationshipKeyPathsForPrefetching apropiado. El efecto neto de esto será que todos los datos que está a punto de iterar se obtienen en un único viaje a la tienda de respaldo, en lugar de que cada pieza individual se obtenga a pedido en una gran cantidad de viajes por separado.

+1

Referencia: [Disminución de la sobrecarga de fallas] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Performance.html#//apple_ref/doc/uid/TP40001075-CH25-SW7) de Documentación de Apple. –

Cuestiones relacionadas