지난시간
지난시간엔 GCD 종류에 대해서 알아보았다. 메인큐, 글로벌큐, 커스텀큐 이렇게 세종류가 있는데 이러한 것들을 묶을 수 있고, 그 그룹이 끝나는 시점을 알고싶을때 사용하는 것이 DispatchGroup 이다. 아주아주 간단하게 설명할 것이므로 심화학습은 추후 실제 사용해보면서...
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 값을 감소시키고, signal 로 semaphore 값을 증가시킬 수 있다. wait 은 3번 쓰고, signal 도 3번 쓸 수있을 것이다. 참고로 defer 은 종료되기 직전에 실행되는 코드다.
DispatchQueue.global().async {
semaphore.wait()
defer {
semaphore.signal()
}
}
결론
와우 DispatchGroup 에 이어서 DispatchWorkItem, Semaphore 까지 알아보았다. 역시 멋진 기능들이 정말 많구나 느꼈고, 하나하나 사용해보면서 자세히 공부해보고 싶다.
'→ Swift Study' 카테고리의 다른 글
[Swift] 약한참조 (weak self) Swift 로 실습해보기 (0) | 2024.01.21 |
---|---|
[Swift] GCD 알아보기 4 - 동시성 관련 문제 (0) | 2024.01.11 |
[Swift] GCD 알아보기 2 - GCD 종류 (0) | 2024.01.09 |
[Swift] GCD 알아보기 1 - 동기, 비동기, 직렬, 동시, 병렬 (1) | 2024.01.08 |
[Swift] Swift의 convenience init 이해하기 (0) | 2023.10.25 |