2010-03-31 2 views
1

J'ai un NSArray appelé 'objets' ci-dessous avec arrayCount = 1000. Il faut environ 10 secondes pour parcourir ce tableau. Est-ce que quelqu'un a une méthode plus rapide d'itérer à travers ce tableau?Le moyen le plus rapide pour itérer à travers un NSArray avec des objets et des clés

for (int i = 0; i <= arrayCount; i++) { 
    event.latitude = [[[objects valueForKey:@"CLatitude"] objectAtIndex:i] floatValue]; 
    event.longitude = [[[objects valueForKey:@"CLongitude"] objectAtIndex:i] floatValue]; 
} 

Répondre

2

Il semble que les tableaux retournés par valueForKey sera le même à chaque itération, alors essayez d'obtenir une référence à la fois en dehors de la boucle:

NSArray *latitudes = [objects valueForKey:@"CLatitude"]; 
NSArray *longitudes = [objects valueForKey:@"CLongitude"]; 
for (int i = 0; i <= arrayCount; i++) { 
    event.latitude = [[latitudes objectAtIndex:i] floatValue]; 
    event.longitude = [[longitudes objectAtIndex:i] floatValue]; 
} 

Mais quel est le point de la boucle? À la fin, ne pas simplement définir les propriétés de l'événement aux dernières valeurs dans les deux tableaux? En outre, si arrayCount est le nombre d'éléments, la boucle doit être de i < arrayCount au lieu de i <= arrayCount.

4

La méthode la plus rapide pour parcourir un NSArray consiste à utiliser fast enumeration. Je votre cas ce serait:

for (id object in objects) { 
    event.latitude = [[object valueForKey:@"CLatitude"] floatValue]; 
    event.longitude = [[object valueForKey:@"CLongitude"] floatValue] 
} 
2

Ajoutant à ce que les autres ont dit ici, l'énumération rapide est plus rapide car il parcourt un tableau C, alors accès indices à l'aide objectAtIndex: a les frais généraux de messagerie Objectif d'objet C. Pensez-y comme si vous demandiez à l'objet NSArray tous ses éléments à la fois, au lieu de demander chaque objet individuellement.

La méthode enumerateObjectsUsingBlock: est presque aussi rapide. Les blocs peuvent être puissants car vous pouvez assigner un morceau de code à une variable et le transmettre.

Je cherchais des repères réels et trouvé ceci:

http://darkdust.net/writings/objective-c/nsarray-enumeration-performance

Questions connexes