1. DispatchGroup
- 비동기적으로 처리되는 작업들을 묶는 기능
- async들을 묶어서 그룹의 작업이 끝나는 시점을 추적 / 어떠한 동작을 수행
- DispatchGroup은 async에서만 사용 가능
- notify, wait, enter, leave이 존재
2. group 등록 - enter / leave
- DispatchGroup은 초기화 구문이 없음
- DispatchGroup 사용방법
- async를 호출하면서 파라미터로 group 지정
- enter / leave를 코드 앞 뒤로 호출하여 group 지정
- enter / leave는 DispatchGroup이 enter() 부터 leave()까지 포함된다 라는 의미
let group = DispatchGroup()
DispatchQueue.main.async(group: group) {}
DispatchQueue.global().async(group: group) {}
group.enter()
DispatchQueue.main.async {}
DispatchQueue.global().async {}
group.leave()
3. 추척 - notify
- DispatchGroup의 처리가 끝나는 시점에 원하는 동작을 수행하기 위한 메서드
let red = DispatchWorkItem {
for _ in 1...5 {
print("🥵🥵🥵🥵🥵")
sleep(1)
}
}
let yellow = DispatchWorkItem {
for _ in 1...5 {
print("😀😀😀😀😀")
sleep(1)
}
}
let blue = DispatchWorkItem {
for _ in 1...5 {
print("🥶🥶🥶🥶🥶")
sleep(2)
}
}
let group = DispatchGroup()
DispatchQueue.global().async(group: group, execute: blue)
DispatchQueue.global().async(group: group, execute: red)
group.notify(queue: .main) {
print("모든 작업이 끝났습니다.")
}
4. 수행대기 - wait
- DispatchGroup의 수행이 끝나기 기다리는 메서드
- notify와 달리 별도의 코드플록을 실행하지 않음
- queue 지정필요 없음
- timeout 파라미터 설정 가능, 지정시간 후에도 작업종료가 되지 않는다면 더 이상 기다리지 않고 다음 코드 실행
let group = DispatchGroup()
DispatchQueue.global().async(group: group, execute: blue)
DispatchQueue.global().async(group: group, execute: red)
group.wait()
print("모든 작업이 끝났습니다.")