はじめに
GCDを使用したマルチスレッドで複数の処理が終了してから終了処理を実行したい!ので調べて書いてみました。
GCDの基本的な概要はこちらの記事が詳しく書いてありました。
http://qiita.com/ShoichiKuraoka/items/bb2a280688d29de3ff18
Dispatch Group
Dispatch Groupを使って終了処理を実装する方法
Global Dispatch Queue(並列)に 処理Blockを追加し実行がすべて終了したらMain Dispatch Queue(メインスレッド:直列)を実行する
サンプルコード
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ NSLog(@"Block0"); });
dispatch_group_async(group, queue, ^{ NSLog(@"Block1"); });
dispatch_group_async(group, queue, ^{ NSLog(@"Block2"); });
dispatch_group_async(group, queue, ^{ NSLog(@"Block3"); });
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"Done!!");
});
解説
dispatch_queue_t
- dispatch_get_global_queue関数を使って
Global Dispatch Queue
を生成しqueue変数に格納
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t
- dispatch_group_create関数を使って
Dispatch Group
を生成しgroup変数に格納
dispatch_group_t group = dispatch_group_create();
処理Blockを追加
- dispatch_group_async関数を使って処理を追加します
- 第一引数には追加する
Dispatch Group
を指定し、第二引数には実行するQueue
を指定し最後に第三引数には実行したい処理を追加します。
dispatch_group_async(group, queue, ^{ NSLog(@"Block0"); });
dispatch_group_async(group, queue, ^{ NSLog(@"Block1"); });
dispatch_group_async(group, queue, ^{ NSLog(@"Block2"); });
dispatch_group_async(group, queue, ^{ NSLog(@"Block3"); });
終了処理を追加
- dispatch_group_notify関数を使って
Dispatch Group
に追加された処理が全て実行されたら実行する終了処理を追加します。 - 第一引数には対象にする
Dispatch Group
を指定、第二引数には実行したいQueue
を指定し、最後に第三引数に終了時に実行したい処理を追加
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"Done!!");
});
実行結果
Blockの実行が並列なのでバラバラに実行されています。
Done.
2017-01-24 10:32:32.599 [85966:2707092] Block0
2017-01-24 10:32:32.599 [85966:2707090] Block1
2017-01-24 10:32:32.599 [85966:2707105] Block2
2017-01-24 10:32:32.599 [85966:2707314] Block3
2017-01-24 10:32:32.605 [85966:2706860] Done!!