본 게시물은 앨런의 인프런 강의를 듣고 작성한 글 입니다.
작업을 분산처리하는 과정에서 필요한 큐는 크게 GCD와 Operation으로 나눌 수 있다.
여기서 GCD 즉, 디스패치큐의 종류는 메인큐, 글로벌큐, 프라이빗큐로 나눌 수 있는다.
이러한 종류의 큐들은 알아서 스레드를 생성하고 처리한다.
1. 메인큐 (main)
먼저, 가장 기본이 되는 메인큐이다. 메인이라는 이름에 걸맞게 딱 한개만 존재하며, Serial이다.
2. 글로벌큐(global)
메인과 다르게 6개가 존재하며 기본설정으로는 Concurrent이다.
존재하는 6개의 큐는 Qos에 따라 나누어진다.
여기서 Qos란 Quality of service로 서비스 품질을 의미한다.
// 거의 즉시 처리해야하는 작업(UI업데이트, 애니메이션, UI관련..)
DispatchQueue.global(qos: .userInteractive)
// 몇초정도 걸리는 작업(즉시 필요하긴 하지만 비동기적으로 처리해야하는 작업)
DispatchQueue.global(qos: .userInitiated)
//디폴트(일반적인 작업)
DispatchQueue.global()
// 몇초에서 몇분의 시간이 걸리는 작업(Process Indicator와 함께 실행, 계산, IO, 네트워킹 등)
DispatchQueue.global(qos: .utility)
// 속도보다는 에너지 효율성을 중시하는 몇분 이상의 작업(데이터 미리 가져오기, 데이터베이스 유지, 유저가 직접적으로 인지하지 않은 시간이 중요하지 않은 작업)
DispatchQueue.global(qos: .background)
// legacy API 지원 (스레드를 서비스 품질에서 제외시키는)
DispatchQueue.global(qos: .unspecified)
위에 있는 Qos일수록 더 중요하다.
6가지 종류의 큐로 작업을 분산시킴으로써 더 빠르게 처리할 수 있다.
Qos가 디폴트일때보다 userInitiated가 더 우선순위가 높다.
따라서 task2의 작업을 Concurrent방식으로 thread에 분산시키고, 이를 먼저 처리한다.
분산시킨 작업을 iOS가 알아서 우선적으로 중요한 일임을 인지하고 스레드에 원순위를 매겨 더 여러개의 스레드를 배치하고 배터리를 더 집중해서 사용하도록 한다.
let queue = DispatchQueue.global(qos: .background)
queue.async(qos: .utility)
위 코드에서는 Qos를 background로 정의하였지만 작업을 보낼때 utility로 변경하면서 더 높은 수준으로 보내게 된다. 따라서 background -> utility로 변경된다.
3. 프라이빗(커스텀)큐 (private)
프라이빗큐는 커스텀으로 만들 수 있다. 디폴트로는 Serial이지만 따로 설정해준다면 Concurrent로도 설정할 수 있다.
Qos도 설정할 수 있다.
let queue = DispatchQueue(label:"custom", attributes: .concurrnet)
이처럼 커스텀큐는 label을 설정해주고 그 이름을 이용하여 사용한다.
attributes를 통해 concurrent을 사용할지, serial을 사용할지 선택할 수 있다. (디폴트는 serial)
'iOS' 카테고리의 다른 글
[iOS] 디스패치 그룹(Dispatch Group) (0) | 2022.12.13 |
---|---|
[iOS] 디스패치큐(GCD) 사용 시 주의해야할 사항 (0) | 2022.12.11 |
[iOS] GCD와 Operation, 동기와 비동기, 직렬과 동시 (1) | 2022.12.05 |
[iOS/Swift] Github OAuth - 깃허브 로그인 구현하기 (2) | 2022.10.08 |
iOS 개인정보 처리방침 (0) | 2022.09.25 |