관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Dispatch Group 본문

iOS 기본 (swift)

[iOS - swift] Dispatch Group

jake-kim 2020. 12. 17. 21:29

* Dispatch Queue 개념 먼저 확인: ios-development.tistory.com/138

GCD의 개념

  • GCD(Grand Central Dispatch)는 iOS에서 thread pool(생성된 Thread들)을 관리하는 개념
  • Dispatch Queue: Thread safe하게 Thread들을 관리할 수 있는 도구
  • Queue의 종류에는 크게 두 가지 존재: Serial Queue, Concurrent Queue
    - Seirial Queue: Main Queue
    - Concurrent Queue: Global Queue
  • Task의 종류에는 크게 두 가지 존재: sync, async
  • QoS(Quality of Service): 우선순위 결정

Dispatch Group 기본 개념

  • DispatchQueue들을 그룹으로 묶어서, 후행 클로저 (일이 끝난다음의 처리)를 할 수 있도록 하는 것
  • 서로 다른 성격의 Queue들을 하나의 그룹으로 묶는 것도 가능
        let queue1 = DispatchQueue(label: "queue1", attributes: .concurrent)
        let queue2 = DispatchQueue(label: "queue2", attributes: .concurrent)

        let group = DispatchGroup()
        queue1.async(group: group) {
            for i in 0...5 {
                print(i)
            }
        }
        queue2.async(group: group) {
            for i in 100...105 {
                print(i)
            }
        }

        let queueForGroup = DispatchQueue(label: "queue3", attributes: .concurrent)
        group.notify(queue: queueForGroup) { // group이 끝난 후 후행 클로저를 실행할 queue삽입
            print("끝")
        }
  • 결과

Dispatch Groupd 핵심 개념

  • enter(): Dispatch Group에 들어가며, task를 +1
  • leave(): Dispatch Group에서 나오며, task를 -1
  • notify(): task가 0이 되었을 때 실행

Dispatch Group 활용 - 코드 실행 순서 정의

* DispatchQueue.main.async 블록 안에서 A실행 후 B실행을 보장하기 위한 방법

  • DispatchQueue.main.async 그룹
DispatchQueue.main.async {

}
  • DispatchGroup() 객체 생성
DispatchQueue.main.async {
    let waitGroup = DispatchGroup()
}
  • enter() 함수 호출 - A 선행 실행을 알림
DispatchQueue.main.async {
    let waitGroup = DispatchGroup()
    waitGroup.enter()
    print(A)
}
  • leave() 함수 호출 - 실행이 끝났다는 것을 알림
DispatchQueue.main.async {
    let waitGroup = DispatchGroup()
    waitGroup.enter()
    print(A) {
        waitGroup.leave()
    }
}
  • notify(queue:) 함수 호출 - B 후행 실행 시작을 알림
DispatchQueue.main.async {
    let waitGroup = DispatchGroup()
    waitGroup.enter()
    print(A) {
        waitGroup.leave()
    }
    waitGroup.notify(queue: DispatchQueue.main) {
        print(B)
    }
}

Dispatch Groupd 활용 예제) 

  • 여러 애니메이션이 끝났을 때, 자동으로 modal view를 띄우고 싶은 경우

  • code
let animationGroup = DispatchGroup()

// enter
animationGroup.enter()
UIView.animate(withDuration: 1.5) {
    self.view1.backgroundColor = .blue
} completion: { _ in

    // leave
    animationGroup.leave()
}

// enter
animationGroup.enter()
UIView.animate(withDuration: 3) {
    self.view2.backgroundColor = .green
} completion: { _ in

    // leave
    animationGroup.leave()
}

// notify
animationGroup.notify(queue: .main) {
    self.performSegue(withIdentifier: "nextSceneSegue", sender: nil)
}
Comments