色々やっていると、やはりGCDの機能をしっかり使いたくなってくる。
ので、調べたりしたものの備忘録をまとめておこうと思います。
GCD(Grand Central Dispatch)とは
カーネルレベルで最適化してくれる、スレッド処理機能、といえばいいのかな。
dispatchキューを作成する
dispatch_queue_t queue = dispatch_queue_create("com.hoge.queue", [attribute]);
create関数を使って新規にキューを作成します。
第2引数のattribute
は、シリアルキューの場合はNULL
を、ConCurrentキューの場合はDISPATCH_QUEUE_CONCURRENT
を指定します。
メモリ管理
GCD自体はメモリ管理してくれますが、メモ自体の意味を忘れているのでとりあえず消しておきます・・。(読んだ本が古かったからそのメモかもしれませんw)
dispatchキューを取得する
新規で生成しなくとも、いくつかのスレッドが最初から生成されているのでそれを使ったほうが色々と楽です。
- dispatch_get_main_queue() … メインスレッドのキューを取得
- dispatch_get_global_queue([type], 0) … 優先度別のキューを取得
タイプ | 優先度 |
---|---|
DISPATCH_QUEUE_PRIORITY_HIGH | 優先度・高 |
DISPATCH_QUEUE_PRIORITY_DEFAULT | 優先度・中 |
DISPATCH_QUEUE_PRIORITY_LOW | 優先度・低 |
DISPATCH_QUEUE_PRIORITY_BACKGROUND | バックグラウンド |
dispatch_after
関数を使って指定時間後にブロックを実行する
一定時間後に処理を実行したい、と思うことは結構あります。
dispatch_after
関数を使えば、とても簡単にそれを実装することができます。
(Xcodeであれば、補完でだいたいの部分を埋めてくれるので、処理と遅延時間だけを入れるだけですぐに実装できます)
// 3秒後に処理を実行
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC));
dispatch_after(time, dispatch_get_main_queue(), ^{
// do something.
});
dispatch_apply
関数を使って反復処理を並列に実行する
dispatch_apply
関数は、並列処理を指定回数繰り返す場合に使えます。
具体的なコードは以下。
size_t iterations = 10;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITIY_DEFAULT, 0);
dispatch_apply(iterations, queue, ^(size_t i) {
NSLog(@"Current i: %lu", i);
});
for文でやっているようなことをブロックを使って実現しています。
また、dispatch_apply
はスレッドをブロックします。
つまり、iterations回数分処理が終わらないとその先に処理が進みません。