Skip to main content

Command Palette

Search for a command to run...

DispatchGroup

Published
DispatchGroup
T

안녕하세요🙇🏻‍♂️ 세상을 더 편리하게 바꾸고 싶은 iOS 개발자 최인호입니다.

Hello 👋 I'm Inho Choi, an iOS developer who wants to change the world more conveniently.

  • 대학교 졸업
  • Apple Developer Academy @ POSTECH 1기
  • KWDC Main Organizer
  • AsyncSwift Organizer

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

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


참고했던 사이트

More from this blog

[CS] Https는 대칭키일까? 비대칭키일까?

결론: 둘 다 쓴다. 하지만 쓰는 타이밍은 다르다. 자세하기 알아보자. 혹시 모르니 용어는 정리해두자. 암호화 <-> 복호화 해독 = 복호화 비대칭키 해독은 대칭키 해독보다 오래 걸린다. 비대칭키를 쓰는 과정 💡 비대칭키는 대칭키를 만들기 위한 여정에 쓰인다. 뭔 소리지??? 대칭키를 만들기 위해서 비대칭키가 쓰인다고?? 비대칭키 해독은 대칭키 해독보다 오래걸린다. 1. Client가 Server에 접속을 요청하면 서버는 Secret ...

Jun 6, 202417

Xcode Cloud 사용 후기

애플에게 내는 친구비를 내며 Apple Developer 계정을 유지하려면 매년 애플에게 13만원의 친구비를 지불해야한다. 그리고 몇 개 친구 답례 상품을 주는데 그 중 하나가 Xcode Cloud 상품 주는데 안 쓸 이유는 없지 Xcode Cloud 개인에게는 과연? K-Spam 이라는 앱을 오랫동안 구상하고 드디어 출시를 했다. 생각보다 삽질을 많이 한 것 같다. 하지만 사이드 프로젝트의 진정한 의미는 삽질(?)하며 배우는 것이 아니겠나 개...

Jun 3, 202418

iOS Version 주의

앱 버전에는 상위버전이 출시한 상태에서 하위 버전을 아카이브 할 수 없음 예를 들어 출시한 버전이 1.3 이면 1.2로는 아카이브가 불가능함 단, 출시한 적이 없는 앱이라면 버전은 마음대로 지정 가능 App Store Connect의 버전 예를 들어 1.03 이랑 1.1 이랑 비교하면 앱 버전은 1.03 > 1.1 로 인식한다. . 단위로 잘라서 Int로 인식하는 것 같다. 그러니 0은 최대한 사용하지 않고 구분한다면 . 으로 구분해야겠다.

Jun 1, 20248

Toby의 iOS 블로그

34 posts

안녕하세요 세상을 더 편리하게 바꾸고 싶은 iOS 개발자입니다.