우리가 main Thread에서 Queue(대기열) 에 작업을 보내면 그에 따른 스레드를 적절히 생성/실행/제거 해주는 역할을 함
GCD는 동시성 프로그래밍 (Thread 여러 개에서 작업하는 것)을 위해 필요한 것.
DispatchQueue.global().async {
}
//-> Dispatch Queue의 종류 중에 하나인 Global DispatchQueue에 작업을보내고
// 비동기로 동작한다
⭐️메인스레드에만 할당되어 있던 일들을 분배. => 메인스레드가 일을 함과 동시에 다른스레드들도 일을 하도록하는 것!
⭐️동시성 프로그래밍을 위해 iOS 가 지원하는 대표적인 개술 중 하나 GCD
디스패치큐/오퍼레이션 , 비동기Async/동기Sync, 직렬Serial/동시Concurrent 개념 정리
디스패치큐(GCD에서 사용하는 큐)
간단한 일(메서드 위주 작업)
오퍼레이션큐
복잡한 일(데이터와 기능을 캡슐화한 객체)
비동기Async
메인스레드가 작업을 다른 스레드에서 하도록 시킨 후 “안기다리고” 다음 작업
동기Sync
메인스레드가 작업을 다른 스레드에서 하도록 시킨 후 “기다리고” 다음 작업
직렬Serial
메인스레드가 다른 큐에 분산시킨 작업을 다른 하나의 스레드에 모두 넘긴다. ( 효율적으로 concurrent가 좋아보이는데 직렬이 필요한 이유? - 특정 작업이 끝난 후 그 결과물을 활용해서 다른작업을 실행하는 등 순서가 중요한 경우 ex. 이미지 다운받고 그 이미지 활용하는경우)
순서가 중요한 작업을 하나의 스레드에서 순서대로 처리
main queue는 직렬로 동작한다.(어차피 하나의 스레드여서)
동시Concurrent
메인스레드가 다른 큐에 분산시킨 작업을 여러개의 스레드로 작업 분산해서 넘김
각자 독립적이지만 유사한 여러개의 작업을 여러 스레드에서 처리
GCD(Grand Dispatch Queue) 디스패치 큐의 종류
메인큐
생성코드 DispatchQueue.main
메인스레드, 1번스레드
Serial(직렬)로 동작한다(하나의 스레드밖에 없으니 당연)
GCD 사용시 중의할 점
UI 작업을 반드시 메인큐에서 !! - 다른 큐에 보낸 작업에 대해 다른 스레드에서 비동기 작업을 하다가도 UI 작업(화면을 다시그리는 작업)은 반드시 메인큐에서 해야한다.
글로벌큐
생성코드 DispatchQueue.global(qos: )
Concurrent(동시)로 동작한다
생성코드에서 볼 수 있는 것처럼 큐 생성 시, qos라는 것을 지정해주어서 시스템이 큐의 중요도/우선순위에 따라 더 많은 스레드를 배치하고 배터리를 집중해서 사용하도록 함
프라이빗(커스텀)큐
생성코드 DispatchQueue.global(label: "..." )
디폴트로는 Serial(직렬)로 동작하지만 Concurrent(동시)로 동작하도록 설정해줄 수 있다.
Concurrent(동시)로 동작하도록 변경해주면 글로벌큐처럼 qos 설정이 가능해진다.
QOS (Quality of Service)
QOS란?
큐의 퀄리티(중요도,우선순위)
글로벌/커스컴 큐를 사용할 때 qos를 사용하여 각 큐의 중요도(작업의 중요도)를 결정할 수 있다.
QOS를 왜 사용하는가?
대기열(큐)의 우선순위를 설정하여 한정된 자원과 에너지를 효율적으로 사용할 수 있다.
QOS 설정에 따른 내부 동작 방법
큐의 우선순위(QOS)가 높으면 스레드를 더 많이 사용하고 CPU 코어 적극적으로 써서 작업을 빠르게 실행하고
큐의 우선순위(QOS)가 낮으면 스레드를 적게 사용하고 CPU 코어 절약을 시도한다
QOS의 6가지 종류
userInteractive
userInitiated
default
utility
background
unspecified
왜 메인큐(❌) 글로벌큐(⭕️)에서 QOS 설정이 가능한가?
메인큐는 직렬(Serial)로 동작 & 어차피 하나의 스레드(1개의 메인 스레드)밖에 없기 때문에 큐의 우선순위 설정 불가
글로벌큐는 QOS 별로 여러 큐 생성가능 → 여러큐에서 여러 스레드에 일이 배치되어 동시(concurrent)에 여러개의 일을 비동기로 처리하기 때문에 각
커스텀큐도 원래는 직렬(Serial)이지만 파라미터를 통해 동시(concurrent)로 변경가능 → 동시(concurrent)로 변경하면 qos 설정 가능
GCD란?
디스패치큐/오퍼레이션 , 비동기Async/동기Sync, 직렬Serial/동시Concurrent 개념 정리
디스패치큐
(GCD에서 사용하는 큐)오퍼레이션큐
비동기Async
동기Sync
직렬Serial
동시Concurrent
GCD(Grand Dispatch Queue) 디스패치 큐의 종류
메인큐
DispatchQueue.main
글로벌큐
DispatchQueue.global(qos: )
프라이빗(커스텀)큐
DispatchQueue.global(label: "..." )
QOS (Quality of Service)
QOS란?
QOS를 왜 사용하는가?
QOS 설정에 따른 내부 동작 방법
QOS의 6가지 종류
왜 메인큐(❌) 글로벌큐(⭕️)에서 QOS 설정이 가능한가?