1. Main Queue
2. Global Queue
3. Custom Queue
* 디스패치큐는 큐의 특성에 맞게 큐가 알아서 스레드에 자기 task를 분배합니다. 프로그래머는 그저 task를 큐에 넣어주면 됩니다.
1. Main Queue
- Serial(직렬) 큐
- 딱 한 개의 큐
- 스레드는 메인스레드 딱 한 개만! (UI 업데이트 처리)
메인 큐는 스레드가 하나밖에 없기 때문에 Serial Queue가 되는 것이 당연합니다.
+) 코드를 작성할 때에 별도의 처리를 하지 않는 이상 모든 일들은 메인 스레드가 작업하게 됩니다.
2. Global Queue
- Concurrent(동시) 큐
- QoS(Quality of Service)에 따라 6종류로 나뉨
QoS는 작업의 중요도를 결정합니다.
소요시간과 종류를 중요도 순으로 나열하자면,
userInteractive - 거의 즉시
사용자와 상호작용 하는 작업. (UI 업데이트, 애니메이션 등)
userInitiated - 몇 초
유저가 즉시 필요하긴 하지만, 비동기적으로 처리된 작업 (pdf파일 열기 등)
default - 디폴트
일반적인 작업
utility - 몇 초 ~ 몇 분
보통 progress bar와 함께 길게 실행되는 작업. (계산, IO, 네트워킹 등)
background - 몇 분 이상; 속도 < 에너지 효율성
유저가 직접적으로 인지하지 않는 시간이 덜 중요한 작업. (데이터 미리 가져오기, 데이터베이스 유지 등)
unspecified
legacy API 지원
Qos가 높은 큐 A와 낮은 큐 B가 있는데, 둘의 task 량은 같습니다. 이 둘이 동시에 실행될 때 iOS는
A가 더 우선적으로 중요한 일임을 인지하고
A에 더 많은 스레드를 배치하고, 배터리를 더 집중적으로 사용하게 합니다.
만약에 아래 예시같이 큐의 QoS와 task의 QoS가 다르다면?
1. Queue QoS < Task QoS = 큐의 품질 상승.
let queue = DispatchQueue.global(qos: .background).async(qos: .utility)
2. Queue QoS > Task QoS = Task의 품질 상승.
let queue = DispatchQueue.global(qos: .utility).async(qos: .background)
더 높은 QoS로 통일되는군요.
3. Custom Queue
- 디폴트: Serial(직렬).
- 직렬 / 동시 둘 다 가능.
- QoS 설정 가능.
let queue = DispatchQueue(label: "com.inflearn.serial")
let queue = DispatchQueue(label: "com.inflearn.serial", attributes: .concurrent)
QoS를 설정하지 않으면 OS가 알아서 추론합니다.
참고 출처 : https://www.inflearn.com/course/iOS-Concurrency-GCD-Operation/dashboard
iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션
동시성(Concurrency)프로그래밍 - iOS프로그래밍에서 필요한 동기, 비동기의 개념 및 그를 확장한 GCD 및 Operation에 관한 모든 내용을 다룹니다., ✍️ 강의 제작 동기 '왜 동기vs비동기 개념, 직렬vs병
www.inflearn.com
'ios' 카테고리의 다른 글
GCD에서 의도치 않은 교착상태를 피하는 법 (0) | 2021.12.22 |
---|---|
DispatchQueue 교착상태 (0) | 2021.12.22 |
동기/비동기, 직렬/동시 (0) | 2021.12.21 |
Error: realm accessed from incorrect thread (0) | 2021.11.19 |
[iOS] Carthage 전환 후기 (0) | 2021.11.18 |
댓글