디스패치큐 알아보기
cocoa application에서 기본으로 제공하는 큐입니다
개요
DispatchQueu의 문서를 보면 아래와 같습니다
main은 type프로퍼티
gloabl()은 타입 메서드로 qos에 옵션을 지정할 수 있습니다
main 큐
main큐는 메인 쓰레드에서 task를 처리하는 Serial 타입의 큐입니다
UI와 관련된 task들은 모두 main큐에서 처리되어야 합니다
UI가 막히지 않고 가장 먼저 처리될 수 있도록 해야하기 때문입니다.
Serial타입이기 때문에 모든 task는 순차적으로 처리되는데 앱의 실행루프(run loop)와 함께 처리되기 때문에 sync로 동작할 시 데드락 발생위험이 존재합니다
main큐의 sync에 대한 포스팅
global 큐
global큐는 Concurrence타입의 백그라운드 큐로서 하나 이상의 task를 동시에 처리할 수 있으며 큐에 추가된 순서대로 작업을 처리합니다
global()은 DispatchQueue의 타입메서드로 qos (Quality of Service)인자를 받습니다
흔히 글로벌큐를 사용할 땐 qos에 인자값을 주지 않는데 이는 qos가 default값을 가지기 때문입니다.
qos는 수행해야할 task의 작업종류를 지정해 주는 것이며 주어진 값에 따라 task의 중요도를 판단해 시스템이 스케줄링을 정합니다
우선순위가 높을수록 우선 처리되고 더 많은 리소스가 부여되기 때문에 더 많은 에너지가 사용됩니다.
따라서 task에 적절한 Qos를 부여하여 효율적인 에너지 관리를 추구할 수 있습니다
Qos가 가질 수 있는 값은 아래과 같습니다
코드
// 글로벌 큐
let backgroundQueue = DispatchQueue.global(qos:.default)
|
cs |
Primary Quality of Services classes
- DispatchQos.userInteractice
사용자가 화면에서 드래그, 축소, 애니메이션 등 처럼 사용자와 상호작용하는 작업을 처리할 때 사용합니다.
메인쓰레드에서 호출됩니다
응답성과 성능에 중점을 두었으며 Qos 중 가장 높은 우선순위를 갖습니다
수행되어야할 시간: 거의 즉각적입니다
- DispatachQos.userinitiated
저장된 문서를 열거나 사용자가 인터페이스를 눌렀을 때와 같이 즉각적인 반응이 필요한 경우 사용되며 매우 빨리 완료되어야 하기 때문에 높은 우선순위를 갖습니다
수행되어야할 시간: 몇초 혹은 그 이하 일 만큼 즉각적
- DispatchQos.utility
데이터를 다운로드 받는것 처럼 시간이 걸리거나 즉각적인 반응이 필요하지 않은작업에 사용되며 일반적으로 progressbar를 함께 표시해 주는것이 일반적입니다.
성능과 에너지 효율 사이에 밸런스를 유지하는 것을 중점으로 둡니다
수행되어야할 시간: 몇초에서 몇분
- DisptachQos.background
인덱싱, 백업과 같은 작업에 사용되며 사용자 눈에 보이지 않는 작업을 할 때 사용합니다
에너지 효율에 중점을 둡니다
수행되어야할 시간: 몇분, 몇시간과 같이 상당한 시간이 소요됩니다
Specail Quality of Services classes
- DispatchQos.default
qos 의 기본값으로 userinitiated와 utility의 사이의 우선순위를 갖습니다.
개발자가 task를 분류하기 위한 옵션이 아니며 qos정보가 할당되지 않은 작업들은 GCD global queue는 이 레벨(default)에서 실행됩니다
- DispatchQos.unspecified
qos 정보가 없음을 나타내며 환경 qos를 추론해야 한다는 단서를 시스템에 제공합니다
애플 배터리 관리 가이드 문서를 통해 Qos에 대한 정확한 정보를 찾을 수 있습니다.
private 큐(커스텀 큐)
Diaptachqueue 생성자로 원하는 큐를 생성할 수 있습니다
let queue = DispatchQueue(label: "mySerialQueue")
let queue2 = DispatchQueue(label: "myConcurrentQueue", attributes: .concurrent)
|
cs |
attributes를 지정하지 않으면 자동으로 Serial 타입의 큐가 생성되고
global처럼 동시수행기 가능한 큐를 만드려면 .concurrent 을 지정하여 생성할 수 있습니다
참고문서
'🍎iOS프로그래밍 > 오늘의 공부' 카테고리의 다른 글
iOS프로그래밍 - 이미지 캐싱(NSCache) (0) | 2022.07.23 |
---|---|
Mac - Source Tree 소스트리 강제종료 현상 (0) | 2022.07.16 |
iOS - DispatchQueue 알아보기 (0) | 2022.07.14 |
iOS - DispatchGroup알아보기 (0) | 2022.07.13 |
iOS - GCD(Grand Central Dispatch)알아보기 (0) | 2022.07.12 |
댓글