GCD, Dispatch Queue iOS 앱 개발을 하면 필수로 알아야하는 개념인데 매번 까먹어서 정리해보려한다.
우리는 보통 GCD, Dispatch Queue를 구분하지 않고 부른다. 요번에 정리하며 알게됐는데 공식문서를 보면 GCD는 동시성 실행을 제공하는 프로그래밍 언어 요소, 런타임 라이브러리 등이라고 합니다. 그래서 따지고 보면 GCD랑 Dispatch Queue 는 같지는 않지만 GCD의 개념으로 동시성 프로그래밍을 지원하는 친구가 Dispatch Queue 라서 같은 의미로 봐도 무방할 것 같습니다.
다른 언어와 달리 iOS 는 Dispatch Queue에 작업을 넣으면 운영체제가 알아서 스레드에 할당해줍니다.
Dispatch Queue에는 2가지 종류가 있는데 Serial과 Concurrent가 있습니다.
기본은 Serial 이며 Concurrent 로 작업하려면 attributes를 따로 세팅해야합니다.
let dispatchQueue = DispatchQueue(label: "concurrent", attributes: .concurrent)
추가로 Private Queue (커스텀 큐) 으로도 만들 수 있는데 다음과 같이 사용하면 된다.
let queue = DispatchQueue(label: "mySerialQueue")
let queue2 = DispatchQueue(label: "myConcurrentQueue", attributes: .concurrent)
그리고 Sync, Async 를 지정할 수 있는데 Sync는 동기, 큐에 추가된 작업이 완료될 때 까지 기다리는 것이고, Async는 비동기, 큐에 작업을 등록하면 완료 여부와는 상관없이 계속 작업을 진행하는 것입니다.
Dispatch Queue를 사용할 때 기본적으로 2가지의 queue를 제공하는데 바로 main과 global 입니다.
DispatchQueue.main().async{}
DispatchQueue.global().async{}
DispatchQueue.global().sync{}
Quality of Service, QOS는 Global Dispatch Queue 에 추가할 수 있는데 작업의 중요도를 설정해서 우선순위를 정할 수 있습니다. 우선순위가 높은 작업은 우선순위가 낮은 작업보다 더 빨리 수행되기 때문에 앱이 수행하는 작업에 적합한 QoS클래스를 정확하게 지정하면, 앱의 성능이 더 좋아진다고 합니다.
( 우선순위가 높은 순으로 정리했으며 공식문서 참고했습니다. )
Sync로 설정했으니 코드가 실행될 때 Serial Dispatch Queue에 작업을 하나 등록하면, 해당 작업이 완료될 때 까지 기다립니다. (main.sync 는 사용을 못하니 주의, 등록순서, 출력순서 일치 o)
Sync로 설정했으니 큐에 등록되는 작업들은 여러 스레드에 분산되어 처리되는데, 앞에 작업이 완료 될 때까지 대기합니다. (등록순서, 출력순서 일치 o)
Async로 설정했으니 작업의 등록은 앞의 작업 완료여부와 상관없이 계속 진행하고, 작업의 수행은 순차적으로 진행합니다. (등록순서, 출력순서 일치 o)
Async로 설정했으니 작업을 완료 여부와 상관없이 계속 등록하고, 등록된 작업들은 스레드에 분산되어서 동시에 실행됩니다. (등록순서, 출력순서 일치 x)