DispatchQueue
- Grand Central Dispatch (GCD)라는 다중 스레딩 라이브러리를 사용하여 멀티스레딩 작업을 조율하고 관리하는데 사용되는 개념
- 즉, 작업 항목의 실행을 관리하는 클래스
- 일반 스레드 보다 쉽고 효울적으로 코드를 작성할 수 있음
- 보통 서버에서 데이터를 받고 이미지 동영상을 외부에서 다운로드 및 처리할 때 CPU 사용량이 많아 처리를 메인 스레드가 아닌 별도의 스레드에서 처리한 뒤 메인 스레드에 결과만 전달하여 CPU를 효율적을 사용 가능
종류
1. Serial Queue
- 작업들이 순차적으로 실행되는 대기열
- 한 번에 하나의 작업만 실행되며, 한 작업이 끝나야 다음 작업이 실행됨
2. Concurrent Queue
- 여러 작업이 동시에 실행될 수 있는 대기열
- 작업 간에 순서는 보장되지 않음
- 대기열에 있는 작업을 동시에 별도의 스레드를 사용하여 실행함
GCD에서 제공하는 Queue
* Main(serial)
- 메인 스레드에서 처리되며, UIKit, SwiftUI의 모든 요소들은 Main Queue에서 수행되어야 함
* Global(Concurrent)
- 시스템 전체에 공유되며, 병렬적으로 동시에 실행이 되긴 하지만 QoS를 통해 우선순위를 정할 수 있음
- 우선 순위가 높은 작업은 낮은 순위의 작업보다 더 빨리 실행되며, 이를 잘 이용하면 빠르고 렉 없는 앱을 만들 수 있음
QoS(Quality of Service)
- DispatchQueue에서 수행할 작업을 분류하기 위해 사용
- QoS를 지정해두어 중요도를 표시하고 시스템이 우선순위를 정하고 이에 따라 스케쥴링
우선 순위 : userInteractive -> unspecified 순으로 낮음
DispatchQueue.global(qos: .userInteractive) {} // Main Queue
DispatchQueue.global(qos: .userInitiated) {} // 유저가 시작한 작업, 유저가 응답을 기다림
DispatchQueue.global(qos: .default) {} // userInitiated 와 utility 의 중간 값
DispatchQueue.global(qos: .utility) {} // 시간이 걸리며 즉각적인 응답이 필요하지 않은 경우
DispatchQueue.global(qos: .background) {} // 눈에 보이지 않는 부분의 작업. 완료 시간 중요 X
DispatchQueue.global(qos: .unspecified) {}
* Sync : Synchronously 동기
- 작업이 다 끝난 다음에만 현재의 Queue에게 컨트롤을 넘김
- 현재의 Queue는 block 상태가 되어 그 작업이 끝날 때까지 대기
* Async : Asynchronously 비동기
- 작업을 수행할 다른 Queue에게 작업을 넘김과 동시에 현재의 Queue에게 컨트롤을 돌려줌
- 작업이 끝나기 전까지 기다릴 필요 없고 동기와 반대로 block 상태가 되지 않음
Sync 사용
DispatchQueue.global(qos: .background).sync {
for item in 1...10{
print("sync : \(item)")
}
}
for item in 100...105{
print(item)
}
- sync 문이 모두 실행된 이후 다음 코드가 실행됨
Async 사용
DispatchQueue.global(qos: .background).async {
for item in 1...10{
print("sync (1) : \(item)")
}
}
DispatchQueue.global(qos: .background).async {
for item in 50...60{
print("sync (2) : \(item)")
}
}
for item in 100...110{
print(item)
}
- Async는 동시에 처리되기 때문에 섞여서 print 됨
참고)
https://seons-dev.tistory.com/entry/Swift-DispatchQueue%EB%9E%80-GCD-Grand-Central-Dispatch
'Swift' 카테고리의 다른 글
Swift - Class, Struct, Enum (0) | 2023.08.23 |
---|---|
Swift - mutating (0) | 2023.08.22 |
Swift - UserDefaults (0) | 2023.08.16 |
Swift - 키보드 올라옴 감지(NotificationCenter, Observer 사용) (0) | 2023.08.11 |
Swift - 프로토콜 (Protocol) (0) | 2023.08.06 |