派遣グループ

6339 ワード

iOS Concurrencyプログラミング、同期非同期処理、GCD/Open-Dispatchキューおよび操作キューについてでまとめた文章を読み終えた

派遣グループ

let group1 = DispatchGroup()



//큐를 보낼 때, 어떤 그룹에 넣을 것인지 정해주기

DispatchQueue.global(qos: ).async(group: group1){

 

}



//그룹이 모두 완료되었을 때 notify는 메인에서도 실행 가능 

group1.notify(queue: DispatchQueue.main){ [weak self] in

       self?.texsLabel.text = "모든 작업이 완료되었습니다."

}

同期待機


何らかの理由でグループの完了通知に非同期で応答できない場合は、waitメソッドを派遣グループで使用できます.
すべてのタスクが完了する前に、現在のキューの同期方法をブロックします.
オプションの(optional)パラメータが必要です.タスクの完了を待つ時間を指定します(指定されていない場合は無期限).

同期完了グループ操作の待機



待機時間の制限



例)昼食画面の状態で、ホームページがまだロードされていない場合は、しばらくしてからスキップします.

派遣グループの使用


queue.async(group: group1){

 group1.enter()  --> 입장 1

 someAsyncMethod{

  group1.leave() --> 퇴장 1

 }

}

派遣プロジェクト


タスクを事前に定義して使用するオブジェクト.キューにコミットするために使用されます.

組み込みのキャンセル機能が悪い


cancel()メソッドは存在します
  • タスクがまだ開始していません(キューに残っています)-タスクは
  • 削除されました.
  • タスクを実行する場合、isCanceledプロパティはtrue(実行を直接停止するタスクではない)
  • に設定されます.

    組み込みが悪い<順序機能>


    Notify(queue:実行するキュー、execute:Dispatch item)メソッドが存在します.
    (直接実行し、実行するプロジェクト(タスク)を指定します.)

    Semaphoreについて


    共有リソースにアクセスできるアクションの数を制限する必要があります.
    let semaphore = DispatchSemaphore(value: 3)
    
    queue.async(group: group1){
      group1.enter() -> 입장 1
      semaphore.wait() -> 일단 기다려 -1 = 2
      someAsyncMethod{
        group1.leave() -> 퇴장 1
        semaphore.signal() -> 세마포어 숫자 +1 = 3
      }
    }