728x90
1) main
메인 이라는 이름 답게 단 한개가 존재하는 메인스레드를 이용한다
serial로 동작하며 보통은 별도 작업을 해주지 않으면 메인스레드에서 처리가 된다
print("task")
이렇게 단순한 출력 코드 조차도
DispatchQueue.main.sync {
print("task")
}
내부적으론 위와 같이 동작하고 있는 것!
2) global
concurrent로 동작하며 총 6가지의 옵션을 지정하여 우선순위를 결정할 수 있다.
중요도가 높은 종류의 큐 사용시 iOS가 알아서 작업을 여러 스레드로 배치하고 배터리를 더 집중해서 사용하도록 한다.
만약 낮은 중요도의 큐 안에 더 높은 중요도의 큐 작업을 보내면 작업 수준은 자동으로 더 높은 중요도의 수준으로 변경된다.
let queue = DispatchQueue.global(qos: .background)
queue.async(qos: .utility) {
}
(중요도 높은 순)
^ | | | | | | | | |
DispatchQueue.global(qos: .userInteractive) 거의 즉시 처리되며 사용자와 직접적으로 상호작용 한다 (UI 업데이트, 애니메이션, UI 반응 등) |
DispatchQueue.global(qos: .userInitiated) 처리 되는데 몇 초가 걸린다. 사용자가 즉시 필요로 하지만 시간이 조금 소요되어도 괜찮은 작업을 비동기적으로 처리하게 된다 (앱 내에서 pdf 파일을 여는 것과 같은 작업들) |
|
DispatchQueue.global() 가장 일반적인 작업 |
|
DispatchQueue.global(qos: .utility) 몇 초에서 몇 분이 걸린다. 보통 progress indicator와 함께 실행되는 작업 (계산, IO, networking 등) |
|
DispatchQueue.global(qos: .background) 몇 분 이상이 걸린다. 속도보다는 에너지 효율을 중요시 하는 작업에 사용되며, 사용자가 직접적으로 인지하지 않는, 시간이 중요하지 않은 작업에 사용된다. (데이터 미리 가져오기, 데이터베이스 유지 등) |
|
DispatchQueue.global(qos: .unspecified) 레거시 api에서 사용된다. |
3) private
디폴트 설정은 serial 이지만 concurrent로 설정이 가능하다.
우선순위(qos)도 설정이 가능하지만 따로 설정하지 않아도 알아서 추론한다.
let queue = DispatchQueue(label: "custom")
// concurrent로 변경
let queue = DispatchQueue(label: "custom:, attributes: .concurrent)
728x90
'iOS > iOS' 카테고리의 다른 글
동시성 프로그래밍 (5) - GCD 사용 시 주의해야할 사항 (0) | 2024.08.21 |
---|---|
동시성 프로그래밍 (3) - GCD/Operation에 앞서 (0) | 2024.08.09 |
동시성 프로그래밍 (2) - GCD/Operation에 앞서 (0) | 2024.07.24 |
동시성 프로그래밍 (1) - GCD/Operation에 앞서 (0) | 2024.07.16 |
네이버 로그인 연동 - 3 / 3 (0) | 2024.04.08 |
댓글