→ Swift Study

[Swift] GCD 알아보기 3 - DispatchGroup

Swift librarian 2024. 1. 11. 11:21

지난시간

지난시간엔 GCD 종류에 대해서 알아보았다. 메인큐, 글로벌큐, 커스텀큐 이렇게 세종류가 있는데 이러한 것들을 묶을 수 있고, 그 그룹이 끝나는 시점을 알고싶을때 사용하는 것이 DispatchGroup 이다. 아주아주 간단하게 설명할 것이므로 심화학습은 추후 실제 사용해보면서...

 

[Swift] GCD/Operation 알아보기 2 - GCD 종류

지난 포스팅 지난 포스팅에서는 동기, 비동기, 직렬, 동시에 대해서 알아보았다. 그리고 iOS 에서는 작업을 분산시킬 때 Queue 라는 대기행렬에 보낸다는 것까지 알게 되었다. [Swift] GCD/Operation 알아

swift-library.tistory.com

 

DispatchGroup

여러 비동기 작업이 완료될 때까지 대기하거나 완료 되었을때 특정 작업을 실행할 수 있다. 사용방법 자체는 의외로 간단하다. 아래와 같이 DispatchGroup 클래스를 사용하여 그룹을 생성한다. 그리고 async 뒤에 group 에 넣어주면 된다.

 

let groupName = DispatchGroup()

DispatchQueue.global().async(group: groupName) {
    // 비동기 작업 수행
}

DispatchQueue.global().async(group: groupName) {
    // 비동기 작업 수행
}

 

아래와 같이 기다리거나 완료되었을때 실행할 코드도 작성할 수 있다.

groupName.wait()

groupName.notify(queue: DispatchQueue.main) {
    // 모든 작업이 완료된 후 실행
}

 

Dispatch WorkItem

Dispatch WorkItem 이라는 것도 있다. 이건 또 뭐냐 하면 작업을 미리 정의해 놓고, 실행하는 방법이다. 간단한 사용방법은 아래와 같이 아이템을 만들어준다.

let workItem = DispatchWorkItem {
    // 비동기로 실행될 작업
}

 

DispatchQueue 를 사용하여 실행해주면 된다.

// workItem 실행
DispatchQueue.global().async(execute: workItem)

 

작업취소지연, 순서 기능도 가능하다. 물론 작업취소는 작업이 안된경우 취소가 되고, 작업이 시작되었다면 isCancelled 속성이 false 가 된다고 한다.

// 작업취소
workItem.cancel()

// 작업지연
workItem.wait()

// 작업순서 지정, workItem 이 끝난 후 workItem2
workItem.notify(queue: DispatchQueue.global(), execute: workItem2)

 

Semaphore 

세마포어라는 것도 있다. 한번에 얼마나 많은 작업을 관리할지를 결정하는 것이다. 최대 몇개의 스레드에서 작업을 할 것인가를 결정한다.

// 동시에 실행할 수 있는 스레드 수 3개
let semaphore = DispatchSemaphore(value: 3)

 

이것을 어떻게 관리하냐면 아래와 같이 .wait(), .signal() 로 갯수를 관리해준다. wait 으로 semaphore 값을 감소시키고, signalsemaphore 값을 증가시킬 수 있다. wait 은 3번 쓰고, signal 도 3번 쓸 수있을 것이다. 참고로 defer 은 종료되기 직전에 실행되는 코드다.

DispatchQueue.global().async {
    semaphore.wait()
    defer {
        semaphore.signal()
    }
}

 

결론

와우 DispatchGroup 에 이어서 DispatchWorkItem, Semaphore 까지 알아보았다. 역시 멋진 기능들이 정말 많구나 느꼈고, 하나하나 사용해보면서 자세히 공부해보고 싶다.