Edit
Grand Central Dispatchとは?(SnowLeopard又はIOS4以降)

マルチコアCPUにおいて、アップル社では簡単で最適なマルチスレッド管理システムを開発した。OSXやIOS以外では、FreeBSDなどに、Apatchライセンスで公開されており、簡単で使いやすく、CPUリソースを効率的に利用する優れたライブラリである。

Edit
特徴

このGCDの特徴には以下のような点がある。

  1. システム全体(すべてのアプリケーション)で共有されるスレッドの為、効率的にスレッドが処理され、全体的な効率が上がりやすい。
  2. 省電力化に有効なマルチコアCPUに向いている。(携帯端末に有効ともいえる)
  3. 命令群が非常に簡単で、すぐにアプリケーションに組み込める。
  4. 他のアプリのスレッドに自分のスレッドのスケジュールが影響を受ける。(1項の理由により)

Edit
実際の命令

Edit
基本命令

基本は、1)キューの作成、2)タスクの登録と実行、3)キューの解放。と3つのコードだけの記述で完了し、マルチスレッド特有のお約束構文(Pool領域や共有領域への意識)を極力減らせるように設計されている。

命令文機能
dispatch_queue_tキュー変数の型dispatch_queue_t image_get_queue;
(dispatch_queue_t) dispatch_queue_create(queueLabel,attribute);キューの作成image_get_queue = dispatch_queue_create("com.gamvaro.image", NULL);
(dispatch_queue_t) dispatch_get_global_queue(priority,flags);キューの作成(グローバルキュー)image_get_queue = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 );
(dispatch_queue_t) dispatch_get_main_queue();キューの作成(メインキュー)main_queue = dispatch_get_main_queue();※メインキューは、他のキューと違いUI管理なども行っている特殊なキューであり、dispatch_main();を実行すると、初めて実行が開始されるキューである。(並列度は1)
dispatch_async( キュー変数, ^{ タスク構文群 } );キューへの追加と実行dispatch_async( image_get_queue, ^{ [self backGroundProcess]; } );
dispatch_release(キュー変数);キュー変数を解放するdispatch_release(image_get_queue);※メインキューやグローバルキューの解放は、システムキューの為、行う必要が無い。

※タスク構文群と記載されている部分は、C言語を拡張した文法拡張「Blocks」をサポートするCコンパイラで利用できるブロック構文で大括弧{}に^をつけた^{と}で囲まれた構文を利用して指定する。これは、上記のperformSelectorInBackground指定であるメソッド1つを指定する方法ではなく、複数の構文を含めることができる文法である。

Edit
グループによるスレッド管理命令

上記の基本的な機能だけではなく、タスクをより深くコントロールするための機能として、タスクのグループ化が行える。これによりタスクが他のスレッドで処理しているにも関わらず、プログラムが終了してしまったり、順番が入れ違ってしまうようなことを防ぐことができる。

命令文機能
dispatch_group_tグループ変数の型dispatch_group_t group_A;
dispatch_group_async(グループ変数,キュー変数,^{ タスク構文群 });グループを指定して、キューへの追加と実行dispatch_group_async( group_A, image_get_queue, ^{ [self background]; });
dispatch_group_wait(グループ変数,制限時間)グループのタスクがすべて終わるまでウェイトするdispatch_group_wait( group_A, DISPATCH_TIME_FOREVER );


Edit
ループ登録命令

命令文機能
dispatch_apply(繰り返し最大値,キュー変数,^(カウンタ変数){タスク構文群 });for文と同じ繰り返し、タスクを登録dispatch_apply(maxCount, image_get_queue, ^(i){ [self backprocess]; });

※この繰り返し構文は、for(i = 0; i < maxCount; i++) { [self backprocess]; }と同じ機能と考えると分かりやすい。