DispatchQueue(GCD)의 종류
1. main queue : Serial
2. global queue : Concurrent / QoS 설정
3. private queue : 디폴트 Serial (Concurrent로 변경 가능) / QoS 추론
Main Queue
DispatchQueue.main
- 한개만 존재 => Main Thread에서 동작
- Serial (직렬)
- UI 처리를 담당
* 쓰레드 없이 날것의 코드를 실행하는 것은 Main Queue에서 sync로 실행하겠다는 것과 같은 의미이다.
* 하지만 DispatchQueue.main.sync는 코드로 사용할 수 없다. (에러)
DispatchQueue.main.sync { ... } // 사용 불가! --ERROR--
DispatchQueue.main.async { ... } // 비동기적으로 main 쓰레드에 보냄
DispatchQueue.main.asyncAfter(.now()+2) {... } // 지금으로부터 2초 뒤에 비동기적으로 main 쓰레드로 보냄
Global Queue
DispatchQueue.global(qos:)
- QoS에 따른 6종류로 나뉨
- Concurrent(동시) : 여러개의 쓰레드로 분산 처리 함
서비스 품질 QoS (Quality of Service)
- 중요한 순으로
userInteractive, userInitiated, default, utility, background, unspecified
// 유저와 직접 인터렉티브 : UI관련 (즉시)
DispatchQueue.global(qos: .userInteractive)
// 반드시 필요, 비동기 처리 : 앱 내에서 첨부파일을 열기, 내부 데이터베이스 조회 등 (몇초)
DispatchQueue.global(qos: .userInitiated)
// 일반적인 작업
DispatchQueue.global()
// ProgressIndicator와 함께 길게 사용되는 작업 : 지속적인 데이터 feed, Networking (몇초~몇분)
DispatchQueue.global(qos: .utility)
// 사용자가 직접적으로 인지하지 않는 부분 : 데이터베이스 유지 등 (속도보다는 에너지 효율성 중시)
DispatchQueue.global(qos: .background)
// 사용하지 않음 legacy API
DispatchQueue.global(qos: .unspecified)
⭐️ XCode에서 UIKit과 SwiftUI같은 UI 코드들은 메인 쓰레드에서만 수행되어야 한다.
⭐️ 이미지 데이터를 global에서 받더라도 UI를 업데이트해주는것은 Main에서 해야한다.
✅ Sync/Async는 메인스레드가 어떻게 작업하냐에 달린거고
✅ Serial/Concurrent는 다른 스레드로 넘겨진 작업들이 어떻게 작업하냐 인 것으로 정리된다.
사용예제
private func loadImage() {
guard let urlString = self.imageUrl, let url = URL(string: urlString) else { return }
DispatchQueue.global().async {
guard let data = try? Data(contentsOf: url) else { return }
guard urlString == url.absoluteString else { return }
DispatchQueue.main.async {
self.movieMainImageView.image = UIImage(data: data)
}
}
}
'Swift > 기본' 카테고리의 다른 글
타입 중첩 (1) | 2024.04.26 |
---|---|
ARC 3편 (클로저에서의 강한 참조 순환) (0) | 2024.04.26 |
ARC 2편 - 강한 참조 순환 (0) | 2024.04.19 |
ARC 1편 - ARC 란? (0) | 2024.04.19 |
메모리 구조 (Code, Data, Stack, Heap) (1) | 2024.04.18 |