main | global | private | |
---|---|---|---|
개수 | 1개 | 여러개 | 여러개 |
Serial VS Concurrnet | Serial | Concurrent | Serial (default) |
Qos | X | 설정 가능 | OS가 추론, 설정도 가능 |
DispatchQueue.main.async {}
// 일반적으로 main 쓰레드에서 동기로 작동한다.
// 실제로 하면 교착상태 위험이 있는 코드이다.
DispatchQueue.main.sync {}
DispatchQueue.global().async {}
// 유저와 직접적 상호작용, UI업데이트, 애니메이션, UI반응 관련 - 거의 즉시
DispatchQueue.global(qos: .userInteractive)
// 유저가 즉시 필요하긴 하지만, 비동기적으로 처리된 작업 - 몇초
DispatchQueue.global(qos: .userInitiated)
// 일반적인 작업
DispatchQueue.global()
// 보통 Progress Indicator와 함께 길게 실행되는 작업, 계산 - 몇초~몇분
DispatchQueue.global(qos: .utility)
// 속도보다는 에너지효율성 중시, 몇분이상
DispatchQueue.global(qos: .background)
// legacy API 지원(사용하지 않는다.)
DispatchQueue.global(qos: .unspecified)
// background qos queue
let queue = DispatchQueue.global(qos: .background)
// 작업을 보낼 때 더 높은 level로 보낸다(background -> utility)
queue.async(qos: .utility) { }
let queue = DispatchQueue(label: "aabbcc")
let queue2 = DispatchQueue(label: "ccddee",
qos: .userInteractive,
attributes: .concurrent)