본문 바로가기

이상/iOS

[iOS] GCD - DispatchQueue

반응형

GCD는 Grand Central Dispatch의 약자로

 

굳이 뜻 풀이를 하면 위엄있는 중앙의 파견이라는 뜻인데

 

우리나라의 국정원 같은 느낌이다.

 

OS단에서 보내는, 그 누구도 중간에서 어떻게 하지 못하는 작업 정도로 이해하면 될 것 같다.

 

시스템에서 관리하는 DispatchQueue에 작업을 submit하여

 

멀티 코어 하드웨어에서 코드를 동시에 실행하게 해주는 프레임워크다.

 

Dispatch (Grand Central Dispatch)

 

앱 개발을 하다보면 서버에서 많은 데이터를 받거나 멀티미디어 처리와 같은

 

무거운 작업을 해야할 경우가 생기는데

 

메인에서 실행시키면 앱이 느려지기 때문에 백그라운드에서 돌리는 편이 좋다.

 

백그라운드에서 무거운 작업을 하고

 

메인에서는 화면에 보여지는 부분에 대한 작업을 하면 훨씬 효율 적이다.

 

이런 경우 GCD를 사용해서 OS에게 Multi Threading을 요청할 수 있다.

 

OS가 대신 일을 해주기 때문에 내가 원하는 대로 작업을 실행하기 위해서는

 

어떻게 사용하는지, 어떤식으로 돌아가는지 파악하고 사용해야 한다.

 

 

 

DispatchQueue

 

GCD는 Thread Safe 한 DispatchQueue라는 것을 제공한다.

 

DispatchQueue라는 이름에서 알 수 있듯 FIFO 순서로 작동한다.

(FIFO: First in First out, 선입선출)

 

앱의 Main Thread 또는 Background Thread에서 순차적 또는 동시적으로 task 실행을 관리한다.

 

DispatchQueue에는 크게 Serial과 Concurrent 두 방식이 있고

 

iOS에서 제공하는 Queue는 Main, Global 두 가지이다.

 

각 Queue는 sync와 async가 있다.

 

Serial

 

한 번쯤 써봤을 DispatchQueue.main.async{} 가 Serial Queue다.

더 정확히 말하면 DispatchQueue.main.async{}는 Main Queue

 

줄줄이 비엔나 소세지다.

 

현재 작업이 끝나면 다음 작업을 순차적으로 실행(직렬)하기 때문에

 

Queue에 작업을 담은 순서대로 작업 완료의 순서가 보장된다.

 

 

Concurrent

 

달리기 시합이다.

 

작업을 동시에 실행(병렬)하기 때문에 순서대로 Queue에 담기지만

 

작업 완료의 순서가 보장되지 않는다.

 

 

작업을 완료하는 데에 2초 걸리는 작업1과 1초 걸리는 작업2를 각 Queue에 담고 실행했을 때

 

SerialQueue에서는 작업1을 다 끝내고 작업2를 하지만

 

SerialQueue

 

ConcurrentQueue에서는 작업1을 실행하고 바로 작업2를 실행하기 때문에

 

작업2가 먼저 끝나고 작업1이 끝난다.

 

ConcurrentQueue

 

 

sync/async

 

syncDispatchWorkItem에 작업을 추가하고 작업이 종료될 때까지 기다린 후 반환하고

 

async는 Queue에 작업을 추가하고 즉시 반환한다.

 

여기서 한 가지 주의할 점이 있는데 Apple Doc에서 DispatchQueue를 보면

 

Main Queue는 sync로 작업을 실행하면 데드락이 발생한다고 돼있다.

 

DispatchQueue - import

때문에 SerialQueue인 Main Queue를 사용할 때는 꼭 async로 사용해야 한다.

 

 

정리해보면 Serial Queue는 작업을 순차적으로 실행하고 Concurrent Queue는 작업을 동시에 실행하며

 

각 Queue는 sync/async로 작업을 실행할 수 있다.

 

때문에 DispatchQueue는 4가지 형태로 사용할 수 있다.

 

Serial - sync (main queue 제외)

Serial - async

Concurrent - sync

Concurrent - async

 

 

Main이나 Global 이외에 Custom형태로도 DispatchQueue를 생성할 수 있는데

 

label 파라미터를 이용하여 id를 부여할 수 있고

 

attributes 파라미터를 이용하여 Serial / Cuncurrent를 선택하여 만들 수 있다.

 

Dispatch Queue - Parameters

 

또한 qos 파라미터를 이용하여 qos를 지정할 수 있다.

 

attributes를 설정하지 않을 경우 default는 Serial인데

 

Main Queue와의 차이점은

 

Main Queue는 Main Thread에서 실행되는 반면에

 

Custom Queue는 기본적으로 Global Queue를 기반으로 실행된다.

 

끝.

반응형