我有一个名为'objects'的NSArray,其中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];
}
答案 0 :(得分:4)
迭代NSArray的最快方法是使用fast enumeration。我的情况是:
for (id object in objects) {
event.latitude = [[object valueForKey:@"CLatitude"] floatValue];
event.longitude = [[object valueForKey:@"CLongitude"] floatValue]
}
答案 1 :(得分:2)
看起来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
。
答案 2 :(得分:2)
添加其他人在此处所说的内容,快速枚举更快,因为它迭代C数组,而使用objectAtIndex:访问索引则具有Objective C对象消息传递的开销。可以把它想象为同时向NSArray对象询问所有内容,而不是单独询问每个对象。
enumerateObjectsUsingBlock:方法几乎同样快。块可以很强大,因为您可以将一大块代码分配给变量并传递它。
我一直在寻找实际的基准测试,并发现了这个:
http://darkdust.net/writings/objective-c/nsarray-enumeration-performance