タスクを非同期に実行する技術
Dispatch Queue の種類
Serial Dispatch Queue : FIFOで現在実行中の処理を待つ
- 1スレッドのみ
Concurrent Dispatch Queue : パラレルに実行
- 複数のスレッドを使用する
Dispatch Queue の生成
Serial Dispatch Queue
dispatch_queue_create(@"キュー名", NULL);
- キューを作成した数だけスレッドが生成される
Concurrent Dispatch Queue
dispatch_queue_create(@"キュー名", DISPATCH_QUEUE_CONCURRENT);
Dispatch Queueはcreateしたものは、releaseが必要!
Dispatch Queue の取得
// メイン
dispatch_queue_t main = dispatch_get_main_queue();
// 優先度高い
dispatch_queue_t high = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
// 標準
dispatch_queue_t def = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 低い
dispatch_queue_t low = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
// バックグランド
dispatch_queue_t back = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
Dispatch Queueの優先度の変更
dispatch_set_target_queue
一定時間後に実行したいもの
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSLog(@"after 2.0");
});
ミリ秒後に実行したい場合は NSEC_PER_MSEC を使用
Dispatch Group
追加した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(@"blk0");});
dispatch_group_async(group, queue, ^{NSLog(@"blk1");});
dispatch_group_notify(group, queue, ^{NSLog(@"done");});
dispatch_release(group);
定期的にチェックしたい場合
long result = dispatch_group_wait(group, 1ull * NSEC_PER_SEC);
if (result == 0 ) {
// すべての処理が終了
} else {
// 処理実行中
}
dispatch_barrier_async : 処理を1つだけしか実行しない事を保証する
読み込みは複数同時で良いが、書き込み中は他の読み込みも行ってほしくない場合等
dispatch_async(queue, blk0_read);
dispatch_async(queue, blk1_read);
// 上記の2つの処理が終わらないとblk_writeは実行しない
dispatch_barrier_async(queue, blk_write);
// blk_writeが終わらないとblk2, blk3は実行しない
dispatch_async(queue, blk2_read);
dispatch_async(queue, blk3_read);
dispatch_apply : 複数回処理を実行する
dispatch_suspend / dispatch_resume : 処理の中断, 再開
dispatch_suspend(queue);
dispatch_resume(queue);
Dispatch Semaphore : データ不整合予防
dispatch_semaphore_wait / dispatch_semaphore_signal(終了) を使い分けしてシンプルなはいた制御を行う
dispatch_onec : 一度だけ実行
singleton等に適用
Dispatch I/O
大きなファイルを読むときに分割して読み込み
0 件のコメント:
コメントを投稿