상세 컨텐츠

본문 제목

GCD(Grand Central Dispatch)를 이용한 MultiThread 프로그래밍

IOS

by 앱등개발자IOS 2022. 5. 16. 19:22

본문

IOS에서 Multi-Thread 프로그래밍을 위해 지원하는 기술인 GCD에 대해서 알아보겠습니다.

 

GCD(Grand Central Dispatch)는 자료구조 시간에 배운 First-In-FIrst-Out구조인 Queue에 작업을 추가하면, 작업에 맞는 스레드를 생성해 실행, 제거까지 해주는 아주 멋진 녀석입니다.ㅎㅎ

이제 Dispatch라는 이름이 붙어있는 이유를 아시겠죠?

 

API통신 시에, URLSession또는 Alamofire를 사용하면서, dispatchQueue.main.asnyc{ task...}라는 블록 안에 UI업데이트 코드를 작성해보신 적이 있으실텐데요,  위와 같이 task를 다른 Thread로 분배할 수 있도록 GCD의 dispatchQueue를 활용하는 것입니다.

 

async와 sync하게 보낸 방식을 비교해보면,

queue.async{ task...}와 같이 task를 async하게 보낸다면, 해당 task를 보낸 Thread는 task에 대한 응답을 받는 것과 관계없이 자신이 할 일을 하게 됩니다.

queue.sync{ task...}와 같이 task를 sync하게 보낸다면, 해당 task가 끝나기를 기다린 후 자신이 할 일을 진행하게 됩니다.

 

SerialQueue와 ConcurrentQueue에 task를 보내는 것에도 차이가 있는데요,

SerialQueue에 담긴 task들은 모두 동일한 Thread에 귀속되어 하나씩 차례대로 실행이되기 때문에 실행순서 예측이 가능합니다.

하지만 Concurrent큐에 담긴 작업들은 여러 Thread로 분배되어 실행되기 때문에, task들이 끝나는 순서를 예측할 수 없습니다.

 

api통신을 구현하다보면, 순서가 중요한 작업을 처리해야하는 경우, 순서 상관없이 빠르면 좋은 경우를 모두 만나볼 수 있는데요,

순서가 예측가능해야한다면 SerialQueue, 순서 상관 없이 빠르게 완료해야한다면 ConcurrentQueue를 사용하면 될 것입니다.

 

중요한 것은 sync/async 그리고 serial/concurrent은 서로 종속적이지 않은 독립적인 개념이라는 것입니다.

sync/async는 task를 보낸 Thread가 해당 요청에대한 결과를 기다릴지에 관한 것이고,

 

serial/concurrent는 Queue로 들어온 task들을 하나의 Thread로 보낼지, 혹은 여러개의 Thread로 분배할 지에 관한 것입니다. 

관련글 더보기