2012-09-28 2 views
21

a-molti in Core Data sono rappresentati da NSSet (come generati automaticamente utilizzando l'Editor ... Crea NSManagedObject sottoclasse .. menu.Come iterare una relazione NSSet (Objective-C) - To-Many in Core Data - in modo efficiente?

Qual è il modo più efficace per iterare un 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 in un altro modo?

+0

Questa pagina: http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-o.html dice che iterare attraverso un NSArray è molto più veloce di NSSet, 0,004713 secs contro 0,025864 sec. – ikevin8me

risposta

18

Il primo è probabilmente più efficace. Se t questi ultimi erano più efficienti quindi Apple avrebbe semplicemente usato quella strada per implementare il primo.

Detto questo, se lo chiedi perché le prestazioni sembrano essere un problema, è probabilmente più che stai spendendo un sacco di tempo nella roba dei Dati di base di oggetti che presentano difetti. Una mossa intelligente sarebbe quella di fare un recupero su self in %@ con groups; impostare il numero di returnsObjectsAsFaults della richiesta di recupero su NO e assicurarsi che siano stati specificati gli appropriati valori relationshipKeyPathsForPrefetching. L'effetto netto di ciò sarà che tutti i dati che stai per iterare vengono scaricati in un singolo viaggio nel backing store piuttosto che ogni singolo pezzo di esso viene prelevato su richiesta in un gran numero di viaggi separati.

+1

Riferimento: [Diminuzione del guasto in eccesso] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Performance.html#//apple_ref/doc/uid/TP40001075-CH25-SW7) da Documentazione Apple. –