2011-01-30 56 views
0

我有很多NSThreads,我想在他們工作的時候睡覺。我該怎麼做? iOS SDK中有WinApi函數WaitForSingleObject/WaitForMultipleObjects的模擬器嗎?等待NSThread

回答

6

有很多方法,但我的主要建議是研究使用libdispatch。

而是產卵NSThreads做:

dispatch_group_t group = dispatch_group_create(); 
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    /* work to do in a thread goes here */ 
}); 
/* repeat for other threads */ 
dispatch_group_wait(group, DISPATCH_TIME_FOREVER); //wait for all the async tasks in the group to complete 

http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_group_async.3.html的文檔。

另一種方法是使用posima或dispatch(http://www.csc.villanova.edu/~mdamian/threads/posixsem.html有一些信息,http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html)的信號量。

(編輯多加一個二選一):

這也將很好的工作,如果你所有的線程基本上做同樣的工作(即拆分任務,而不是做了一堆不同的任務),並且是更簡單:

dispatch_apply(count, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t i){ 
doWork(someData, i); 
}); 
+0

但我已經使用NSThread編寫了如此多的代碼!有NSThreads的方式嗎? – 2011-01-30 21:11:46

0

這聽起來像是你應該重新考慮你的應用程序的體系結構。有很多線程,特別是在iOS上,幾乎可以保證比較簡單的設計更慢,最明顯的是比較簡單。

在iOS上,只有一個核心,總​​線帶寬非常有限。

儘可能使用更高級別的系統提供的併發工具(NSOperation,dispatch和任何異步API)將會好得多。