DispatchGroup

DispatchGroup은 작업의 모음의 동기화를 허용합니다. 여러 다른 작업을 제출하고, 다른큐에서 실행되어도 작업이 모두 완료되면 추적할수 있습니다. 해당 그룹의 작업은 지정된 작업이 완료될때가지 완료할수 없습니다.

예제

let group = DispatchGroup()
let queue = DispatchQueue(label: "kr.mjun")
let queue1 = DispatchQueue(label: "kr.mjun")
let queue2 = DispatchQueue(label: "kr.mjun")

group.enter()
queue.async {
    print("q의 작업")
    group.leave()
}
group.enter()
queue1.async {
    print("q1의 작업")
    group.leave()
}

group.enter()
queue2.async {
    print("q2의 작업")
    group.leave()
}

group.wait(timeout: .distantFuture) // 그룹의 작업이 끝날때까지 기다림
print("그냥 프린트")

-----------------
q의 작업
q1의 작업
q2의 작업
그냥 프린트

enter(), leave()를 사용하여 컨텍스트 관리를 합니다. group.wait()는 해당 작업이 모두 끝날때까지 대기합니다. wait()는 동기형태이기 떄문에 저곳에서 해당 그룹의 작업이 끝날때가지 대기합니다.

비동기 형식으로 바꾸고 싶다면

group.notify() 를 사용할수 있습니다.

예제(enter(), leave() 를 사용하지 않는 다른 방법)

let group = DispatchGroup()
let queue = DispatchQueue(label: "kr.mjun")
let queue1 = DispatchQueue(label: "kr.mjun")
let queue2 = DispatchQueue(label: "kr.mjun")


queue.async(group: group) {
    print("q의 작업")
}

queue1.async(group: group) {
    print("q1의 작업")
    
}
queue2.async(group: group) {
    print("q2의 작업")
    
}
group.notify(queue: DispatchQueue.main) {
    print("그룹의 작업이 모두 완료되면 해당 클로저가 호출됩니다!")
}

print("그냥 프린트")
-------------------------
그냥 프린트
q의 작업
q1의 작업
q2의 작업
그룹의 작업이 모두 완료되면 해당 클로저가 호출됩니다!

Reference

Concurrent Progrmming Guide

DispatchQueue
DispathGroup