iOS를 프로그래밍을 하다보면 저 쓰레드가 끝나야 다음걸 작업하는데? 어떡하지?
고민하는 경우가 많다.
이 경우에는 DispatchGroup을 사용하는게 적당할 수 있다.
DispatchGroup에 대해서 파해쳐보자.
내가 원하는 작업을 여러 쓰레드에 분할 하고 싶다. 하지만 내가 원하는 것은 빨간 선!
DispatchGroup의 모든 Task가 끝나는 시점이다.
let dispatchGroup = DispatchGroup()
let firstWorker = DispatchQueue(label: "first")
let secondWorker = DispatchQueue(label: "second")
dispatchGroup.enter()
firstWorker.async(group: dispatchGroup) {
sleep(2)
print("First worker is working")
dispatchGroup.leave()
}
dispatchGroup.enter()
secondWorker.async(group: dispatchGroup) {
sleep(1)
print("Second worker is working")
dispatchGroup.leave()
}
위와 같은 방식으로 DispatchGroup에 할당하고 DispatchQueue에 일을 줄 수 있다.
enter()
는 이 그룹의 Task가 일을 배당 받았다! 라는 의미이다.
leave()
는 이 그룹의 Task가 일을 끝냈다! 라는 의미이다.
일종의 Count를 한다고 보면 좋음 enter는 +1 leave는 -1
만약 Count가 0이라면 notify(queue:)
라는 함수가 작동한다.
let dispatchGroup = DispatchGroup()
let firstWorker = DispatchQueue(label: "first")
let secondWorker = DispatchQueue(label: "second")
dispatchGroup.enter()
firstWorker.async(group: dispatchGroup) {
sleep(2)
print("First worker is working")
dispatchGroup.leave()
}
dispatchGroup.enter()
secondWorker.async(group: dispatchGroup) {
sleep(1)
print("Second worker is working")
dispatchGroup.leave()
}
dispatchGroup.notify(queue: .global()) {
print("Group End")
}
// Second worker is working
// First worker is working
// Group End
위 코드를 보면 dispatchGroup
에 붙은 WorkItem이 모두 실행되고 난 후에
Group End가 출력되는 것을 볼 수 있음
하지만 notify
뒤에 붙는 클로져도 DispatchworkItem
이다 일종의 일회성이라고 봐야함
공식 문서를 보면 DispatchWorkItem으로 나와 있다.
그 말은 notify로 붙은 WorkItem은 단 1번만 작동한다는 뜻이다.
let dispatchGroup = DispatchGroup()
let firstWorker = DispatchQueue(label: "first")
let secondWorker = DispatchQueue(label: "second")
dispatchGroup.notify(queue: .global()) {
print("Group End")
}
dispatchGroup.enter()
firstWorker.async(group: dispatchGroup) {
sleep(2)
print("First worker is working")
dispatchGroup.leave()
}
dispatchGroup.enter()
secondWorker.async(group: dispatchGroup) {
sleep(1)
print("Second worker is working")
dispatchGroup.leave()
}
// Group End
// Second worker is working
// First worker is working
실제 출력도 보면 Group End 가 가장 먼저 출력 된 것을 볼 수 있음
생각해보면 Group에 어떤 Item도 안 붙었음
Count가 0임
notify 가 실행됨
Count가 바로 0이기에 notify로 붙은 WorkItem이 바로 실행
애플 공식 문서도 그리 설명하고 있다.