GCD(DispatchGroup)の場合


なぜDispatchGroupを使うのですか?


GCDを使用すると、非同期プログラミングを使用して、複数のスレッドを分散処理してタスクを処理します.Dispatch Groupを使用します.この場合、すべての作業を完了する必要があります.

たとえば、アプリケーションの最初の画面のすべての画像をダウンロードした後、昼食画面を閉じます.
しかし、すべての画像をダウンロードしたタスクと、すべてのタスクを完了した時点を正確に区別できないと、写真のようなユーザは誤った画面を見ることになる.これらの問題を解決するには、すべてのタスクの終了時間を決定するために、タスクをグループ化する必要があります.

DispatchGroupの使用例

let group1 = DispatchGroup()

DispatchQueue.global(qos: ).async(group: group1) { //동기적 함수 }
DispatchQueue.global(qos: ).async(group: group1) { //동기적 함수 }
DispatchQueue.global.async(group: group1){ //동기적 함수 }

//notifiy
group1.notify(queue. DispatchQueue.main) { [weak self] in
   self?.textLabel.text = "group1 completed"
   
//wait1
group1.wait(timeout: DispatchTime.distantFuture

//wait2
if group1.wait(timeout: .now() + 60) == .timedOut {
	print("60초 안이 작업이 모두 완료되지 않습니다.")
}

1) notify


必要なタスクを1つのDispatchGroupにパッケージ化し、別のキューに送信して非同期でタスクを処理します.さらに、これらのすべての操作が完了すると、プライマリ・スレッドにすべての操作が完了したことを通知する方法も使用されます.プロセスを下図に示します.

2) wait


これは、すべてのタスクが完了する前に現在のキューをブロックする同期方法です.ただしnotifyとは異なり、プライマリスレッドで呼び出すことはできません.プライマリ・スレッドで待機するとアプリケーションが停止するため、他のスレッドを使用して処理する必要があります.
  • group1.wait(timeout : DispatchTime.distantFuture)
    これは盲目的に待つ方法です.
  • if group1.wait(timeout: .now() + 60) == .tiemdOut
    これは時間の制限です.

  • DispatchGroupの注意事項


    以前、各スレッドで処理された関数は同期関数でした.
    DispatchQueue.global(qos: ).async(グループ:グループ1){//同期関数}
    しかし、内部関数が同期関数ではなく非同期関数であれば、どのような問題がありますか?非同期メソッドを使用すると、タスクは別のスレッドに送信され、すぐに返されるため、タスクを完了するのではなく、同時にタスクを実行するしかありません.だから、私が欲しい仕事が終わる時間を間違えるかもしれません.この場合、DispatchGroupのenter、leaveを使うべきです.入場数と退場数が同じ場合、グループの仕事が終わったと判断できるようにするためです.使用例を以下に示します.
    queue.async(group: group1){
    	group1.enter()
        someAsyncMethod{//비동기함수의 클로저 
        	group1.leave() //끝났으면 퇴장 알림
        }
    }
    

    終了時..。


    非同期関数の使用を学習しながら,作業の終了点を理解して処理し,最近KaKao Blind二次テストを思い出した.これまでアルゴリズムはC++で解いてきたが,今回のテストではAPI呼び出しとJson Parserを使う必要があるため,自信のないSWIFTでテストした.その時、私は要求に合ったシミュレーションをしなければなりません.複数のAPIを呼び出し、私が望んでいるタスクの完了に基づいて処理するのは難しいです.これは、Alamofire非同期ライブラリを使用しても、必要な実行手順を作成できないこと自体が不足していることは明らかです.我々は,GCDやCloserなど最近学習している非同期プログラミングの概念と応用を育成し,効率的なアプリケーションを作成する能力を育成するために努力しなければならない.