[iOS] GCD


GCD

  • Grand Central Dispatch
  • Cベースの
  • テープライブラリ
  • 、低レベルのAPIを提供し、同時にバックグラウンドでThreadを管理する
  • アプリケーションを実行すると、システムは2つの基本キュー(Main QueueとGlobal Queue)を生成します.
  • Dispatch Queue


    タスクは、
  • の最初の出力(FIFO)構造で実行されます.
  • シリーズDispatch QueueとConcurrent Dispatch Queueに分けられます.
  • syncメソッドとasyncメソッドがあります.
  • Apple公式ドキュメント
  • Serial Dispatch Queue

  • シリアル処理
  • に登録されたジョブは、1回ずつ順番に処理される.
  • で処理中のタスクを完了すると、次のタスクが処理されます.
  • // MARK: [코드 1] Custom Serial Dispatch Queue 예시
    // (qos 설정 가능하지만 설정 안해주면 iOS 가 작업을 판단해서 qos 추론한다.)
    let serialQueue = DispatchQueue(label: "myQueue.serial")

    Concurrent Dispatch Queue

  • 並列処理
  • からの作業完了を待たずに、できるだけ多くの作業を実行します.
  • は、登録されたジョブを一度に処理するのではなく、複数のジョブを同時に処理する.
  • // MARK: [코드 2] Custom Concurrent Dispatch Queue 예시
    // (qos 설정 가능하지만 설정 안해주면 iOS 가 작업을 판단해서 qos 추론한다.)
    let concurrentQueue = DispatchQueue(label: "myQueue.concurrent", attributes: .concurrent)

    Main Queue

  • メインスレッド(UIスレッド)で使用するシリアルキュー
  • すべてのUI処理は、プライマリスレッド内で行われる必要があります.
  • // MARK: [코드 3] Main Queue 예시
    let mainQueue = DispatchQueue.main

    Global Queue

  • パラレル配信キュー
  • サービス品質パラメータは、
  • の処理優先度に対して提供される.
  • は同時に事を処理するので、仕事を終える順番は決められませんが、優先的に事を処理することができます.
  • // MARK: [코드 4] Global Queue 예시
    let globalQueue = DispatchQueue.global(qos: .background)

    qosパラメータ(優先度設定)

  • Apple公式ドキュメント
  • DispatchQueue.global(qos: .userInteractive)
  • userInteractive
  • 位が最も高かったのは
  • でした
  • すぐに完了する必要があるタスク
  • 動画/イベント処理/UI更新
  • DispatchQueue.global(qos: .userInitiated)
  • userInitiated
  • ユーザーがアプリケーションを積極的に使用することを禁止します.
  • DispatchQueue.global()
  • default
  • 通常タスク
  • DispatchQueue.global(qos: .utility)
  • utility
  • ユーザーが積極的に追跡しない操作に使用されます.
  • DispatchQueue.global(qos: .background)
  • background
  • メンテナンス/クリーンアップタスク
  • DispatchQueue.global(qos: .unspecified)
  • unspecified
  • の最下位は
  • です

    同期メソッド

  • 同期方法
  • は、このタスクを処理する場合、次のタスクを行うのではなく、滞在を継続し、そのタスクの処理が完了した後、次のタスクを継続する.
  • 時間の大きなタスクが必要な場合や、いつ終わるか分からないタスクであれば、タスクを処理する過程で何もしないので、アプリケーションがカードになったり、反応していないように見える可能性があるので、この場合syncメソッドは一般的に使用されません.
  • // MARK: [코드 5] Dispatch Queue 의 sync 메소드 예시
    DispatchQueue.main.sync {
    	print("SYNC METHOD 실행중 ~~")
    }
    
    print("SYNC METHOD 실행 끝 !")
  • [コード5]を実行すると、「SYNC METHODを実行中~~」が最初に出力され、「SYNC METHOD実行終了!」出力します.
  • asyncメソッド

  • 非同期方法
  • 指示処理
  • の後、次の段階に進む.
  • 主に
  • 時間の大規模なタスクまたはいつ終了するか分からないタスク(ex.ネットワーク、ファイルロードタスク)に使用されます.
  • // MARK: [코드 6] Dispatch Queue 의 async 메소드 예시
    DispatchQueue.global(qos: .background).async {
    	print("ASYNC METHOD 실행중 ~~")
    }
    
    print("ASYNC METHOD 실행 끝 !")
  • [コード6]を実行すると、「ASYNMETHOD実行終了!無条件に先に出力し、「ASYNMETHOD運転中~~」を出力します.
  • リファレンス

  • https://www.zehye.kr/ios/2020/04/23/11iOS_GCD_NSOperation_queue/
  • https://www.notion.so/GCD-API-65882583e57f4d798a33ad8a25ac5fad