互いに独立した3つのタスクを実行する必要があるので、それらを同時に実行したいと思います。しかし、私はそれらすべてが別のオブジェクトに通知するために終了している必要があります。AFAIK、* dispatch_apply *は並行スレッドを作成しますが、オブジェクトのコレクションまたは配列を繰り返し、同じタスクをいくつかのループで実行します。スレッドごとに異なるタスクを実行したいと思います。GCDを使ってやりたいことはできますか?そうでない場合、最善の方法は何ですか?
ありがとう!
互いに独立した3つのタスクを実行する必要があるので、それらを同時に実行したいと思います。しかし、私はそれらすべてが別のオブジェクトに通知するために終了している必要があります。AFAIK、* dispatch_apply *は並行スレッドを作成しますが、オブジェクトのコレクションまたは配列を繰り返し、同じタスクをいくつかのループで実行します。スレッドごとに異なるタスクを実行したいと思います。GCDを使ってやりたいことはできますか?そうでない場合、最善の方法は何ですか?
ありがとう!
を使用しdispatch_group
ます。並行性プログラミングガイドは1つの例を示しており、さらに役立つAPIがあります。
を使用してディスパッチグループを作成しますdispatch_group_create
。
を使用してキューに入れることにより、各「タスク」をグループに入れますdispatch_group_async
。
dispatch_group_enter
(または、とを使用して、各タスクの開始と停止を手動でGCDに通知しますdispatch_group_leave
。)
グループ内のすべてのタスクが完了したときにブロックを実行するには、を使用してブロックをキューに入れdispatch_group_notify
ます。
(または、アプリの設計で同期的に待機できる場合は、dispatch_group_wait
代わりに使用してください。)
グループが終わったら、dispatch_release
それです。
ディスパッチグループはあなたが必要とするものです。GCD関数を見てください。グループと並行キューを作成します(または標準のキューを使用します)。3つの操作(ブロック)をdispatch_groupに関連付け、4番目のブロックを作成し、そのブロックにdispatch_group_wait(メモリによる名前の入力)を実行させます。それが戻ると、他のオブジェクトに「成功」メッセージを送信できます。待機中のブロックを任意の並行キューに入れます。
私は自分のアプリでこれを正確に行います。
あなたがGCDについて質問したことは知っていますが、NSOperationQueue
別の可能性もあります。例えば:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 3;
// create my completion operation (which will be added to the queue later, once
// the dependencies with all of the other operations has been established)
NSBlockOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"All done");
}];
// let's add our three operations
NSBlockOperation *operation;
operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"starting task 1");
sleep(5);
NSLog(@"stopping task 1");
}];
[completionOperation addDependency:operation];
[queue addOperation:operation];
operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"starting task 2");
sleep(4);
NSLog(@"stopping task 2");
}];
[completionOperation addDependency:operation];
[queue addOperation:operation];
operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"starting task 3");
sleep(6);
NSLog(@"stopping task 3");
}];
[completionOperation addDependency:operation];
[queue addOperation:operation];
// now let's add the completion operation (which has been configured as dependent
// upon the other operations
[queue addOperation:completionOperation];
この問題に取り組むにはたくさんの異なる方法がありますが、NSOperationQueue
別の選択肢です。並行性プログラミングガイドでは、すべてのオプションについて説明しています。