관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Swift] DispatchQueue의 종류와 DispatchQueue(qos:) qos의 종류 본문

iOS 응용 (swift)

[iOS - Swift] DispatchQueue의 종류와 DispatchQueue(qos:) qos의 종류

jake-kim 2022. 12. 5. 22:00

DispatchQueue의 종류

  • main queue (serial queue)
  • global queue (concurernt, qos 설정 가능)
  • custom queue (디폴트는 serial이며 concurrent로 변경 가능)

global queue

  • DispatchQueue.global(qos:)
  • global queue는 모두 concurrent queue임을 주의
  • qos는 Dispatch.QoS.QoSClass 타입

https://developer.apple.com/documentation/dispatch/dispatchqos/qosclass

  • concurrent 큐이고 qos 설정이 가능
  • qos(quality of service)
// 애니메이션과 같은 UI 즉시 업데이트가 필요하며, 멈춘것처럼 보이지 않는 작업들 (유저의 반응)
DispatchQueue.global(qos: .userInteactive)

// 저장된 문서를 열거나, 유저가 무언가 클릭했을 때 작업을 수행하고 즉각 보여주어야 하는 것 (몇초)
DispatchQueue.global(qos: .userInitiated)

// 기본 서비스 (일반적인 경우 - userInitiated와 utility의 중간정도의 우선순위)
DispatchQueue.global(qos: .default)

// 보통 프로그레스바를 같이 사용하는 작업
DispatchQueue.global(qos: .utility)

// 유저에게 표시되지 않는 동기화, 안정화, 백업과 같은 일
DispatchQueue.global(qos: .background)
  • qos에 따라 다른 내부 동작 방법
    • 우선순위가 높은 작업일수록 해당 작업이 빠르게 실행도려고 하고, 우선순위가 낮을수록 더 효율적인 CPU 코어를 절약하려고 시도

qos에 관한 더욱 구체적인 내용은 이곳 참고

Custom Queue

  • DispatchQueue(label:attributes:) 형태
    • label에는 큐의 이름을 정의 (로깅할때 어떤 큐인지 구분에 유리)
    • 디폴트는 serial queue이지만 attributes 파라미터에 .concurrent를 넣으면 concurrent queue로 사용
let mySerialQueue = DispatchQueue(label: "myQueue")
let myConcurrentQueue = DispatchQueue(label: "myQueue", attributes: .concurrent)

* 참고

https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html#//apple_ref/doc/uid/TP40015243-CH39-SW1

https://tngusmiso.tistory.com/49

https://developer.apple.com/documentation/dispatch/dispatchqos/qosclass

Comments