메이쁘

[Swift] GCD 와 DispatchQueue(Serial, Concurrent) 에 대한 간단 명료 설명! 본문

Language/Swift

[Swift] GCD 와 DispatchQueue(Serial, Concurrent) 에 대한 간단 명료 설명!

메이쁘 2020. 6. 9. 20:43

안녕하세요.

 

 

최근에 iOS 업무를 맡게 되어

 

퇴근 후 틈틈히 공부하며 기록하려고 합니다.

 

 

그럼 포스팅 진행하겠습니다!

 

 

 

 

GCD 란 ?


  -  iOS에서 쓰레드 관련(특히 멀티쓰레딩) 작업을 처리하기 위해 사용함

 

  -  Grand Central Dispatch 의 약자로, 포그라운드(main = UI)와 백그라운드 작업을 알맞게 처리하기 위한 API

 

  -  시간이 오래 걸리는 작업을 방해하지 않고 UI 작업을 원활히 처리할 때 주로 사용함

 

  -  즉, 특정 작업을 어떤 쓰레드가 맡을 것인지, 멀티 쓰레드 방식을 사용할 것인지, Sync 또는 Async(동기와 비동기) 방식 중 어떤 것을 선택할지 정해서 사용하는 API

 

  -  GCD 를 사용하기 위해 DispatchQueue 라는 큐 방식으로 수행함

 

GCD의 장점은 ?


  • reduces the memory penalty for storing thread stacks in the app’s memory space.
  • eliminates the code needed to create and configure your threads.
  • eliminates the code needed to manage and schedule work on threads.
  • simplifies the code

  -  메모리 사용량을 절약시킨다.

  -  쓰레드를 사용하기 위한 코드 사용이 줄고(효율성) 쓰레드를 관리하기 용이하다.

  -  코드를 더 단순하게 만들 수 있다.(가독성, 재사용성 등)

 

 

 

그래서 그런가 애플에서도 이제 GCD 사용을 권장(강요?) 하고 있다고 합니다!

 

 

그럼, 간단하게 어떻게 사용하는지 알아보겠습니다.

 

 

 

 

DispatchQueue 에 대해


이벤트(작업) 들을 원소로 갖는 큐 라고 보시면 됩니다.

 

그렇기 때문에 FIFO(First-In-First-Out) 로 관리되며

 

특정 이벤트(작업) 을 큐에 넣고, 쓰레드가 특정 작업들을 특정 방식(동기, 비동기) 으로 처리하는 것이라고 이해하면 됩니다.

 

 

DispatchQueue 는 크게 SerialQueueConcurrentQueue 가 있는데요.

 

 

 

SerialQueue직렬 방식의 메인 쓰레드 큐 라고 생각하시면 됩니다.

 

메인 쓰레드 이기 때문에 주로 UI 작업을 도맡아 하고

 

앞에서부터 하나씩 꺼내서 작업을 수행하고, 수행이 다 끝나면 다음 작업을 꺼내 수행하는 방식으로 진행합니다.

 

 

DispatchQueue.main.async {
	// 작업 처리 코드 작성
}

실제 사용하는 코드 일부.. 괄호 안닫혀있습니다..

 

*** SerialQueue 자체가 직렬 방식이라 UI같이 큰 작업을 수행하기 때문에 sync 로는 잘 사용하지 않습니다.

*** 그렇기 때문에, Sync로 사용하게 되면 DeadLock 상태에 빠지게 될 수 있습니다.

 

 

 

 

다음으로, ConcurrentQueue 에 대해 알아봅시다.

 

ConcurrentQueue동시성을 가진 큐 입니다.

 

*** 참고로, 동시성(Concurrent) 과 병렬(Parallel) 처리는 다른 개념입니다!

*** 동시성하나의 쓰레드가 빠른 시간 주기로 작업을 번갈아가며 처리하는 것으로,

     하나 이상의 쓰레드가 동시에 여러 작업을 처리하는 병렬 과는 다릅니다.

*** 그렇기 때문에, 동시성은 병렬 처럼 보이는 것입니다!

 

 

UI를 제외한 작업들을 주로 처리합니다.

 

또한, SerialQueue 와는 달리 sync, async 둘 다 사용 가능합니다.

 

마지막으로, QoS(Quality Of Service) 클래스를 사용할 수 있어 상황과 특성에 맞게 작업을 처리하는 설정을 할 수 있습니다.

 

*** QoS에 대한 설명은 다른 포스트에서 다뤄보겠습니다.ㅎㅎ

 

 

사용 코드. QoSClass 는 위와 같이 총 6개의 타입이 있다. 

 

 

 

 

 

틀린 부분이 있으면 댓글 부탁드립니다.

 

감사합니다.

 

건강하세요!

 

 

'Language > Swift' 카테고리의 다른 글

[Swift] @IBOutlet 과 @IBAction 의 의미 및 생성 방법.  (0) 2020.07.12
Comments