2011-01-30 7 views
0

私は多くのNSThreadを持っています。彼らが働いている間に眠りたいです。どうしたらいいですか? 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を参照してください。

代わりに、posixまたはdispatch(http://www.csc.villanova.edu/~mdamian/threads/posixsem.htmlにはhttp://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.htmlのような情報があります)のセマフォを使用することもできます。

(1つのより多くの選択肢を追加して編集した):

これはまた、すべてのスレッドが(つまり、タスクを分割ではなく、異なるタスクの束をやって)本質的に同じ仕事をしている場合はうまく動作し、かつあるだろうはるかに簡単:

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

しかし、私はすでにNSThreadを使ってたくさんのコードを書いています! NSThreadsには何らかの方法がありますか? –

+0

はい、私が述べたセマフォはNSThreadsでうまく動作します。 –

+0

iOS SDKにセマフォーはありますか? –

0

本当にあなたのアプリのアーキテクチャを再考する必要がありますように聞こえます。特にiOS上で多くのスレッドを持つことは、シンプルな設計よりもかなり遅く、そして間違いなくバギーになることが保証されています。

iOSでは、コアが1つしかなく、バスの帯域幅が大幅に制限されています。

可能な限り上位レベルのシステム提供の並行性ツール(NSOperation、ディスパッチ、および非同期APIのいずれか)を使用する方がずっと良いでしょう。