久しぶりにiOSプログラミングをしてみたところ、GCDについてさっぱり忘れていたので、次からはすぐに思い出せるようにメモ。
Blocksとは
Blocksは他の言語でいうところの無名関数、またはクロージャ。BlocksはAppleによるC言語の独自拡張機能なのでXcode付属のコンパイラでしか使えない。ObjectiveCはC言語を内包しているから、ObjectiveCでもBlocksを使うことができる。
GCDではBlocksを処理の単位として扱う。
Blocksメモ
- キャプチャされた変数はキャプチャ時点のコピーとなる(参照ではない)
- キャプチャされた変数をBlock内で書き換えるには、その変数の宣言時に
__block
指定子が付加されている必要がる
GCD(Grand Central Dispatch)とは
非同期処理を楽に行うためにAppleが作った仕組み。Dispatch Queueと呼ばれるキューに処理(Blocks)を追加するだけなので本当に楽。
Dispatch Queue
処理を実行するためのキュー。2種類ある。
Dispatch Queueの種類
- Serial Dispatch Queue : 追加されたタスクを順番に実行する。1個のDispatch Queueにつき、1スレッド利用するので作り過ぎに注意。
- Concurrent Dispatch Queue : 追加されたタスクを並行に実行する
Dispatch Queueの入手
Dispatch Queueは自分で作成することもできるし、システムが用意しているものを利用することもできる。システムが用意しているDispatch Queueは以下のものがある。
- Main Dispatch Queue : メインスレッドで実行されるSerial Dispatch Queue
- Global Dispatch Queue : 優先度別に4つあるConcurrent Dispatch Queue
入手方法は逆引きを参照
逆引き
- Dispatch Queueの入手
- Serial Dispatch Queueを作成する :
dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL)
- Concurrent Dispatch Queueを作成する :
dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT)
- Main Dispatch Queueを取得する :
dispatch_get_main_queue()
- Global Dispatch Queueを取得する :
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)
- Serial Dispatch Queueを作成する :
- タスクの追加
- Dispatch Queueにタスクを追加する : dispatch_async
- Dispatch Queueにタスクを追加する(実行完了まで待つ) : dispatch_sync
- 一定時間後にDispatch Queueにタスクを追加する : dispatch_after
- すべてのタスクが終わってからタスクを追加する(Concurrent用) : dispatch_barrier_async
- アプリ実行中、1度のみ実行されるタスクを追加する : dispatch_once
- その他
- セマフォ作成 :
dispatch_semaphore_create( 0 )
- セマフォ待機(デクリメント) : dispatch_semaphore_wait
- セマフォ合図(インクリメント) : dispatch_semaphore_signal
- タスクを一時停止する : dispatch_suspend
- タスクを再開する : dispatch_resume
- セマフォ作成 :