Search
🔢

[iOS] DispatchQueue QoS

안녕하세요 iOS 개발자 워너비 루크입니다!
오늘은 GCD DispatchQueue 의 파라미터인 QoS 에 대해서 알아보려고해요
QoS 가 무엇인지 대략적으로 요약하자면 작업들의 우선순위라고 생각하시면 돼요
무작위로 실행하기 보다 작업들의 우선순위를 정해주게 되면 아무래도 효율이 좋아지겠죠?
특히 사용자가 느끼기에 앱이 빠릿빠릿해야 만족도가 높아지잖아요 그래서 UI업데이트와 같이 사용자에게 직접 영향을 주는 작업은 다른 작업에 대해서 더 리소스를 많이 확보해 둘 필요가 있어요.
QoS 를 사용하면 앱의 작업에 적절한 우선순위를 부여할 수 있답니다 ㅎ
우선적으로 실행한다는 게 다른 작업의 실행을 무한정 미루는 게 아닌, 딱 적절하게 지연시킨다고 하네요
적절하게 QoS 만 부여해주면 앱의 효율성을 크게 높일 수 있을 것 같습니다.
하나씩 살펴보죠!

Choosing a Quality of Service Class

User-interactive : main thread에서 작업,
1.
사용자 인터페이스(UI) 새로고침 또는
2.
애니메이션 수행과 같이 사용자와 상호작용 하는 작업입니다.
작업이 신속하게 수행되지 않으면, UI가 중단된 상태로 표시될 수 있습니다. 반응성(responsiveness)과 성능(performance)에 중점을 둡니다.
Duration of work to be performed(수행해야될 작업의 기간?) - 순식간에 끝난다.(Work is virtually instantaneous.)
User-initiated : 사용자가 시작한 작업이며,
1.
저장된 문서를 열거나,
2.
사용자 인터페이스에서 무언가를 클릭할 때 작업을 수행하는 것
과 같은 즉각적인 결과가 필요합니다. 사용자 상호작용을 계속하려면 작업이 필요합니다. (The work is required in order to continue user interaction) 반응성과 성능에 중점을 둡니다.
Duration of work to be performed : 거의 순식간이며, 몇 초 또는 그 이하입니다.
Utility : 작업을 완료하는 데 약간의 시간이 걸릴 수 있으며,
1.
데이터 다운로드 또는
2.
import
 즉각적인 결과가 필요하지 않습니다. 유틸리티 작업에는 일반적으로 사용자가 볼 수 있는 progress bar가 있습니다. 반응성, 성능 및 에너지 효율성 간에 균형을 유지하는 데 중점을 둡니다.
Duration of work to be performed : 작업은 몇초에서 몇분정도가 걸립니다.
Background : 백그라운드에서 작동하며, 
1.
indexing, 동기화 및 백업
과 같이 사용자가 볼 수 없는 작업. 에너지 효율성에 중점을 둡니다.
Duration of work to be performed : 작업은 분(minutes) 또는 시간(hour)과 같은 상당한 시간(significant time)이 걸립니다.
사용자 작업이 발생하지 않는 시간의 90% 이상을 Utility QoS level 에서 사용하는 것이 좋다

Special Quality of Service Classes

추가적으로 알고 있으면 좋은 QoS 도 존재해요
Default : user-initiated와 utility사이의 우선순위. 작업 분류용이 아니라 QoS 의 디폴트 값이다.
GCD global queue는 이 level(default)에서 실행된다
Unspecified : 우선순위를 부여받지 못했으며, 우선순위를 추론해 달라는 QoS.쓰레드가 기존(legacy) API를 사용하는 경우, Unspecified QoS를 사용할 수 있으며, 이경우 쓰레드가 QoS를 벗어날 수 있습니다.