DispatchGroup
- DispatchQueue는 Tread를 Safe하게 관리할 수 있는 도구이다.
- 특징
- DispatchQueue들을 Group으로 묶어서 trailing closure를 할 수 있도록 한다.
- 서로 다른 성격의 Queue들을 Group으로 묶어서 사용 가능하다.
- enter와 leave의 위치를 작업 단위로 설정하여 개발자가 원하는 작업의 범위를 지정할 수 있다. 아래 예시는 for문 한 사이클을 1작업으로 두고 enter & leave를 했지만, for문 밖에 enter & leave를 한다면 총 1쌍으로 notify를 보낼 수 있다.
- 예시
let dispatchGroup = DispatchGroup()
func queueTask(number: Int,
completionHandler: @escaping (String) -> Void) {
// 여기서 시간이 지연되는 작업이 있어도 끝날 때까지 Wait
// sleep(2)
completionHandler("Number \(number) is Entered.")
}
for i in 0..<10 {
dispatchGroup.enter()
print("")
print("=========== dispatchGroup.enter(\(i)) ===========")
print("")
queueTask(number: i) { text in
print(text)
dispatchGroup.leave()
print("")
print("=========== dispatchGroup.leave(\(i)) ===========")
print("")
print("_________________________________________________")
print("")
}
}
dispatchGroup.notify(queue: .main) {
print("This is Dispatch Group Notify")
}
// 출력 결과
/**
=========== dispatchGroup.enter(0) ===========
Number 0 is Entered.
=========== dispatchGroup.leave(0) ===========
_________________________________________________
=========== dispatchGroup.enter(1) ===========
Number 1 is Entered.
=========== dispatchGroup.leave(1) ===========
_________________________________________________
...
...
...
_________________________________________________
=========== dispatchGroup.enter(9) ===========
Number 9 is Entered.
=========== dispatchGroup.leave(9) ===========
_________________________________________________
This is Dispatch Group Notify
*/