본문 바로가기
🍎iOS프로그래밍/오늘의 공부

iOS - 디스패치큐 알아보기 - main, global(), private

by 둥둥동동# 2022. 7. 15.
728x90

 

디스패치큐 알아보기

 

cocoa application에서 기본으로 제공하는 큐입니다

 

 

개요

 

DispatchQueu의 문서를 보면 아래와 같습니다

https://zeddios.tistory.com/516

 

main은 type프로퍼티

 

gloabl()은 타입 메서드로 qos에 옵션을 지정할 수 있습니다

 

 

 

main 큐

 

 

main큐는 메인 쓰레드에서 task를 처리하는 Serial 타입의 큐입니다

UI와 관련된 task들은 모두 main큐에서 처리되어야 합니다 

UI가 막히지 않고 가장 먼저 처리될 수 있도록 해야하기 때문입니다. 

Serial타입이기 때문에 모든 task는 순차적으로 처리되는데 앱의 실행루프(run loop)와 함께 처리되기 때문에 sync로 동작할 시 데드락 발생위험이 존재합니다

 

main큐의 sync에 대한 포스팅

main큐에서 sync하지 않는 이유

 

 

global 큐

 

https://zeddios.tistory.com/516

 

global큐는 Concurrence타입의 백그라운드 큐로서 하나 이상의 task를 동시에 처리할 수 있으며 큐에 추가된 순서대로 작업을 처리합니다

global()은 DispatchQueue의 타입메서드로 qos (Quality of Service)인자를 받습니다

흔히 글로벌큐를 사용할 땐 qos에 인자값을 주지 않는데 이는 qos가 default값을 가지기 때문입니다.

qos는 수행해야할 task의 작업종류를 지정해 주는 것이며 주어진 값에 따라 task의 중요도를 판단해 시스템이 스케줄링을 정합니다

우선순위가 높을수록 우선 처리되고 더 많은 리소스가 부여되기 때문에 더 많은 에너지가 사용됩니다.

따라서 task에 적절한 Qos를 부여하여 효율적인 에너지 관리를 추구할 수 있습니다

 

Qos가 가질 수 있는 값은 아래과 같습니다

https://zeddios.tistory.com/516

 

코드

// 글로벌 큐
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에 대한 정확한 정보를 찾을 수 있습니다.

 

https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html

 

Energy Efficiency Guide for iOS Apps: Prioritize Work with Quality of Service Classes

Energy Efficiency Guide for iOS Apps

developer.apple.com

 

private 큐(커스텀 큐)

 

Diaptachqueue 생성자로 원하는 큐를 생성할 수 있습니다

 

let queue = DispatchQueue(label: "mySerialQueue")
let queue2 = DispatchQueue(label: "myConcurrentQueue", attributes: .concurrent)
cs

 

attributes를 지정하지 않으면 자동으로 Serial 타입의 큐가 생성되고

global처럼 동시수행기 가능한 큐를 만드려면 .concurrent 을 지정하여 생성할 수 있습니다

 

 

 

참고문서

 

https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html

 

Energy Efficiency Guide for iOS Apps: Prioritize Work with Quality of Service Classes

Energy Efficiency Guide for iOS Apps

developer.apple.com

 

https://zeddios.tistory.com/516

 

iOS ) GCD - Dispatch Queue사용법 (1)

안녕하세요 :) Zedd입니다. ㅂㄷㅂㄷ 다시 쓰겠음 의 앞부분을 읽고오시면 도움이 될 것 같아요. GCD에 대한 개념?은 건너뛰고 사용법만 볼거라..그리고 글에서 문서를 그만읽는다고 했었는데, 문

zeddios.tistory.com

728x90

댓글