- 비동기적으로 처리되는 작업들을 그룹으로 묶음
- 그룹 단위로 작업 상태를 추적할 수 있는 기능
- async들을 묶어서 그룹의 작업이 끝나는 시점을 추적하여 다른 동작을 수행시킬 수 있음
- 이때의 async 작업들은 꼭 같은 큐, 스레드에 있지 않더라도 묶을수 있음
- async에서만 사용할 수 있음
group에 등록하기: enter, leave
- DispatchGroup은 특별한 초기화 구문이 없음
- init() 메서드로 바로 초기화해 필요한 만큼 인스턴스를 만들어서 사용
- 함께 관리할 작업들에는 같은 인스턴스를 지정
DispatchGroup 사용 방법
- async를 호출하면서 파라미터로 group을 지정
- enter, leave를 코드의 앞뒤로 호출하여 group을 지정
- DispatchGroup이 enter()부터 leave()까지 포함된다는 의미
let group = DispatchGroup()
// enter, leave를 사용하지 않는 경우
DispatchQueue.main.async(group: group) {}
DispatchQueue.global().async(group: group) {}
// enter, leave를 사용하는 경우
group.enter()
DispatchQueue.main.async {}
DispatchQueue.global().async {
}
group.leave()
notify
- DispatchGroup의 업무 처리가 끝나는 시점에 원하는 동작을 수행하기 위한 메서드
import Foundation
let group = DispatchGroup()
let red = DispatchWorkItem {
for _ in 1...5 {
print("🥵🥵🥵🥵🥵")
sleep(1)
}
// self.group.leave()
}
let yellow = DispatchWorkItem {
for _ in 1...5 {
print("😀😀😀😀😀")
sleep(1)
}
}
let blue = DispatchWorkItem {
for _ in 1...5 {
print("🥶🥶🥶🥶🥶")
sleep(2)
}
}
DispatchQueue.global().async(group: group, execute: blue)
DispatchQueue.global().async(group: group, execute: red)
// group.enter()
// DispatchQueue.global().async(execute: blue)
// DispatchQueue.global().async(execute: red)
group.notify(queue: .main) {
print("모든 작업이 끝났습니다.")
}
- notify(queue:)의 queue는 코드블록을 실행시킬 queue를 말함
wait
- DispatchGroup의 수행이 끝나기를 기다리기만 하는 메서드