Grand Central Dispatch

 タスクを非同期に実行する技術

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 件のコメント:

コメントを投稿

ReactNativeでAndroid対応する話

前提 ReactNativeでiOS版のアプリをリリースしていて、Android版をリリースする話 トラブルシューティング Build.VERSION_CODES.Q が存在しないエラー compileSdkVersionを29以上にすると解決 メモリー足りないエラー Execu...