2013-10-09 47 views
5

最近我使用enumerateKeysAndObjectsUsingBlock:,今天我猶豫了,當我的一位同事在工作場所指出,這種枚舉方法可以從單獨的線程調用,我的代碼可能無法按預期工作。他甚至建議我應該使用快速枚舉。問題是我真的很喜歡enumerateKeysAndObjectsUsingBlock:,並且由於字典本身的特性而不喜歡快速列舉。enumerateKeysAndObjectsUsingBlock:我可以確定它是在同一個線程上調用的嗎?

我的方法看上去如下

- (NSArray *)someMethod 
{ 
    __block NSMutableArray *myArray = [NSMutableArray array]; 

    [self.myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
     [myArray addObject:obj]; 
    } 

    return myArray; 
} 

我可以肯定地說myArray的將始終返回預期值(假設self.myDictionary不爲空),它會被稱爲永遠的同一個線程中的someMethod的?

我知道有一個方法enumerateKeysAndObjectsWithOptions:usingBlock:並調用它與NSEnumerationConcurrent選項將同時在多個線程上運行枚舉。

但我找不到關於enumerateKeysAndObjectsUsingBlock的任何文檔。
同樣是指在陣列上使用的enumerateObjectsUsingBlock:

+1

對於快速枚舉的「自然」,你不喜歡這麼強烈,你寧願使用這種你不確定的方法嗎? –

+0

這個命令在這裏重要嗎?如何在這個塊中的數組中存儲東西? – Unheilig

+0

「性質」我的意思是調用allKeys枚舉它們,然後訪問該對象,而塊枚舉你避免了。阻止 - 更方便,更簡單的代碼,也許在我的結尾寫作更少。 – sumofighter666

回答

7

正如您所看到的,除非您撥打enumerateKeysAndObjectsWithOptions並選擇NSEnumerationConcurrent選項,否則您可以放心,它們不會同時執行。至於enumerateKeysAndObjects的非併發呈現是否在同一線程上運行(儘管我願意這麼做),它是否不在同一隊列上運行並不重要,因爲它與尊重您稱爲枚舉方法的線程。底線,你的同事的線程相關的問題是沒有價值的。

但我會注意到,在我的軼事測試中,這些枚舉方法比枚舉速度慢。如果速度是最重要的(例如,特別是在使用巨大字典/數組的情況下),那麼您可能希望使用快速枚舉。但在大多數情況下,差異並不重要。

+1

我同意@Rob的說法。我想補充一點,'enumerateKeysAndObjectsUsingBlock:'實際上調用'enumerateKeysAndObjectsWithOptions:usingBlock:'內部傳遞'0'作爲'options'參數。 – Hejazi

+0

@Hejazi你是怎麼知道/知道的?請詳細說明一下。謝謝。 – Unheilig

+0

@Unheilig我發現通過檢查調用堆棧和註冊塊執行時。 – Hejazi

相關問題