[Swift] GCD에 대하여

정환우·2021년 2월 2일
2

iOS

목록 보기
17/24
post-thumbnail

GCD 란?

GCD : Grand Central Dispatch
C기반의 저수준 API라고 한다.

iOS 앱 개발을 하게 되면 필수로 알아야 하는 것인데, DispatchQueue와 같다고 생각하면 될 듯.

DispatchQueue

Serial, Concurrent

DispatchQueue에는 두 가지가 있다.

  • Serial Queue : 등록된 작업을 한번에 하나씩 차례대로 처리 하는 직렬의 Queue.

  • Concurrent Queue : 등록된 작업을 한번에 하나씩 처리 하지 않고 여러 작업들을 동시에 작업하는 병렬의 Queue.

let serialQueue = DispatchQueue(label: "magi82.serial")
print(serialQueue)	// Serial Dispatch Queue

let concurrentQueue = DispatchQueue(label: "magi82.concurrent",
                                    attributes: .concurrent)
print(concurrentQueue)	// Concurrent Dispatch Queue

기본은 Serial Queue이고, Concurrent Queue로 사용하려면 따로 attributes 선언을 해줘야 한다.

Sync, Async

그리고 또 각 queue는 SyncAsync 두 가지로 나눌 수 있다.
Sync는 말그대로 동기, Async는 말 그대로 비동기인데, Sync는 큐에 추가된 작업이 종료될 때 까지 기다리는 것이고, Async는 큐에. 작업을 추가하지만 완료 여부는 보장하지 않는 것이다.
그래서 총 4가지의 조합이 나오는데

  • Serial - Sync
  • Concurrent - Sync
  • Serial - Async
  • Concurrent - Aync

이렇게 4가지의 조합이 나온다.

Main, Global

앱 실행시 시스템에서 기본적으로 2개의 Queue를 만들어 주는데, 그것이 Main QueueGlobal Queue 이다.

  • Main Queue : 메인 스레드에서 사용 되는 Serial Queue. 모든 UI 처리는 메인 스레드에서 처리를 해야한다.

  • Global Queue : 편의상 사용할 수 있게 만들어 놓은 Concurrent Queue. 처리 우선 순위를 위한 QOS(Quality of Service) 파라미터를 제공한다. 작업 완료의 순서는 정할 수 없지만 우선적으로 일을 처리하게 할 수 있다!

  • Custom Queue : GlobalQueue에서 수행되는 임의로 정의한 Queue. Serial & Concurrent 모두 가능하나 보통 Serial 작업 수행. Main과 구분해 사용이 필요할 때 사용

QOS 우선 순위

  1. userInteractive
  2. userInitiated
  3. default
  4. utility
  5. background
  6. unspecified

Conclusion

sync는 작업이 끝날 때까지 기다리기 때문에 UI 업데이트는 main thread의 async만 사용 가능하다.
raywenderlich 예제에서는 UI 업데이트를 위해 아래와 같이 코드를 작성하고 있다.

DispatchQueue.global(qos: .userInteractive).async {
  forLoop("선행 작업")
  
  DispatchQueue.main.async {
    print("선행 작업 후 UI 변경")
  }
}

이렇게 하면 서버에서 데이터를 받아오거나, 사전에 처리해야할 부분이 있을 경우 UI업데이트를 자연스럽게 할 수 있다고 한다!

출처 :
GCD 정리
GCD에 대해서 알아보기

0개의 댓글