DispatchQueue 초기화
Apple Developer Documentation
DispatchQueue는 main, global을 사용하지만 초기화를 통해 커스텀하여 사용할 수 도 있다.
convenience init(label: String,
qos: DispatchQoS = .unspecified,
attributes: DispatchQueue.Attributes = [],
autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit,
target: DispatchQueue? = nil)
//dispatchqueue의 초기화 함수
-
label
- 디버깅 환경에서 추적하기 위해 작성하는 String값, 식별자와 같은 것.
-
qos
- DispatchQoS 값을 받는다. QoS란 Quality of Service의 약자로 실행 될 작업들의 우선순위를 정해주는 값.
-
attributes
- serial, concurrent, initiallyInactive 속성을 넣는다. 직렬큐 병렬큐 속성을 정하는 것.
- initiallyInactive는 다른 속성과 다르게 sync,async와 코드블록을 호출하자마자 작업이 처리되지 않고 작업을 제어할 수 있음. 큐에만 담길 뿐 active() 를 호출하기 전 까지 작업을 처리하지 않는다.
- 예시 코드
import Foundation
let yellow = DispatchWorkItem {
for _ in 1...5 {
print("😀😀😀😀😀")
sleep(1)
}
}
let myDispatch = DispatchQueue(label: "Odong", attributes: .initiallyInactive)
myDispatch.async(execute: yellow) // 코드 블록 호출 안됨.
myDispatch.activate()
-
autoreleaseFrequency
- dispatchQueue가 자동으로 객체를 해제하는 빈도의 값을 결정하는 파라미터. (객체를 autorelease해주는 빈도, 기본값은 inherit)
- inherit: target과 같은 빈도를 갖는다.
- workItem: workitem이 실행될 때마다 객체들을 해제한다.
- never: autorelease를 하지 않는다.
-
target
- 코드 블록을 실행할 큐를 target으로 설정할 수 있다.
QoS
Apple Developer Documentation
파라미터 중 우선순위를 결정해주는 Qos 파라미터에 대해 자세히 알아보기
- QoS는 작업 순서의 우선순위가 아니라 무엇에 더 많은 에너지를 사용할까? 의 우선순위다.
- 하지만 스레드 관리는 시스템이 하기 때문에 QoS에 넣는 값은 정량적인 수치, 절대적인 값이 아니다.
- QoS 정보를 통해 스케쥴링, CPU 및 I/O처리량, 타이머 대기시간 등의 우선순위를 조정한다.
QoS 열거형
DispatchQos는 열거형 타입으로 총 6개의 유형을을 가지고 있다.
(우선순위가 높은것이 제일 위 쪽)
- userinteractive
- main 스레드에서 작업하며, 사용자 인터페이스 새로고침, 애니메이션 등 사용자와 상호작용 하는 작업에 할당한다. 작업이 빠르게 수행되지 않으면 유저 인터페이스는 멈추게 된다. 반응성, 성능에 중점을 둔다.