0

併發編程指南(PDF版)的第37和39頁似乎是相矛盾的。在37頁,代碼片段指定以下內容:調用detachNewThreadSelector:target:object:vs dispatch_async()

if (![anOp isConcurrent]) 
    [anOp start]; 
else 
    [NSThread detachNewThreadSelector:@selector(start) toTarget:anOp withObject:nil]; 

這看起來不錯,但在第39頁的文件中指出:

您可以使用調度隊列幾乎執行所有的任務是 你曾經在單獨的線程上執行。調度 隊列的優點是它們更易於使用,並且在執行那些任務時比相應的線程代碼更有效。

因此,而不是調用detachNewThreadSelector:target:object:,爲什麼不調用dispatch_async()代碼?

回答

0

我可以看到你在說什麼。我認爲每種方式都有效,但根據情況你應該選擇哪一根。需要注意的是NSOperationQueues很好用;在mac osx中,他們使用GCD進行優化,因此它們是一個不錯的選擇。在iOS 4及以下版本中,他們沒有。所以使用GCD是你應該認真考慮如果在以前版本的iOS上工作的東西。如果您發送新的NSThread操作系統必須保持切換線程,這可能是一個性能問題。 GCD使用了泳池方法,這意味着如果這樣做很好,它將重新使用現有的線程。

希望這點指向正確的方向

+2

從iOS 4開始,NSOperationQueue使用GCD。 [NSOperationQueue類參考](http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html) – titusmagnus

+0

我糾正了,謝謝titusmagnus – geminiCoder