LoginSignup
85
91

More than 5 years have passed since last update.

[Objective-C] GCDについての備忘録

Last updated at Posted at 2014-04-01

色々やっていると、やはり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はARC有効時でもメモリ管理をしてくれません。

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回数分処理が終わらないとその先に処理が進みません。

85
91
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
85
91