본문 바로가기
Swift/기본

DispatchQueue.main과 DispatchQueue.global

by 밤새는탐험가 2024. 4. 20.

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