2010-03-31 47 views
1

我有一個名爲'objects'的array對象,它的arrayCount = 1000。它需要大約10秒來遍歷這個數組。有沒有人有更快的方法來迭代這個數組?用對象和鍵遍歷NSArray的最快方法

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

回答

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

4

迭代NSArray的最快方法是使用fast enumeration。我你的情況,這將是:

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

添加到別人已經在這裏說,快速列舉更快,因爲它遍歷C數組,而使用objectAtIndex訪問指數:有目標C對象的消息的開銷。把它看作是一次詢問NSArray對象的所有東西,而不是單獨詢問每個對象。

enumerateObjectsUsingBlock:方法幾乎同樣快。塊可以是強大的,因爲你可以將一段代碼分配給一個變量並傳遞給它。

我一直在尋找實際的基準測試,發現這個:

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