Самый быстрый способ перебрать NSArray с объектами и ключами - PullRequest
1 голос
/ 31 марта 2010

У меня есть NSArray с именем 'objects' ниже с arrayCount = 1000. Для перебора этого массива требуется около 10 секунд. У кого-нибудь есть более быстрый способ перебора этого массива?

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

Ответы [ 3 ]

4 голосов
/ 15 декабря 2011

Самый быстрый способ перебора NSArray - использовать быстрое перечисление . В вашем случае это будет:

for (id object in objects) {
    event.latitude = [[object valueForKey:@"CLatitude"] floatValue];
    event.longitude = [[object valueForKey:@"CLongitude"] floatValue]
}
2 голосов
/ 20 февраля 2014

В дополнение к тому, что здесь сказали другие, быстрое перечисление происходит быстрее, поскольку оно выполняет итерацию массива C, тогда как доступ к индексам с помощью objectAtIndex: накладывает накладные расходы на обмен сообщениями объекта Objective C. Думайте об этом, как о том, чтобы запрашивать объект NSArray сразу за все его содержимое, а не запрашивать каждый объект отдельно.

enumerateObjectsUsingBlock: метод почти такой же быстрый. Блоки могут быть мощными, потому что вы можете назначить кусок кода переменной и передать его.

Я искал фактические тесты и нашел это:

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

2 голосов
/ 31 марта 2010

Похоже, что массивы, возвращаемые valueForKey, будут одинаковыми на каждой итерации, поэтому попробуйте получить ссылку на них один раз за пределами цикла:

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];
}

Но в чем смысл цикла? В конце концов, разве он не устанавливает свойства событий на последние значения в двух массивах? Кроме того, если arrayCount - это число элементов, тогда цикл должен быть до i < arrayCount вместо i <= arrayCount.

...