DispatchGroup

DispatchGroup

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이 바로 실행

애플 공식 문서도 그리 설명하고 있다.


참고했던 사이트