GCD : Grand Central Dispatch
C기반의 저수준 API라고 한다.
iOS 앱 개발을 하게 되면 필수로 알아야 하는 것인데, DispatchQueue
와 같다고 생각하면 될 듯.
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 선언을 해줘야 한다.
그리고 또 각 queue는 Sync
와 Async
두 가지로 나눌 수 있다.
Sync
는 말그대로 동기, Async
는 말 그대로 비동기인데, Sync
는 큐에 추가된 작업이 종료될 때 까지 기다리는 것이고, Async
는 큐에. 작업을 추가하지만 완료 여부는 보장하지 않는 것이다.
그래서 총 4가지의 조합이 나오는데
이렇게 4가지의 조합이 나온다.
앱 실행시 시스템에서 기본적으로 2개의 Queue를 만들어 주는데, 그것이 Main Queue
와 Global Queue
이다.
Main Queue
: 메인 스레드에서 사용 되는 Serial Queue
. 모든 UI 처리는 메인 스레드에서 처리를 해야한다.
Global Queue
: 편의상 사용할 수 있게 만들어 놓은 Concurrent Queue
. 처리 우선 순위를 위한 QOS(Quality of Service) 파라미터를 제공한다. 작업 완료의 순서는 정할 수 없지만 우선적으로 일을 처리하게 할 수 있다!
Custom Queue
: GlobalQueue에서 수행되는 임의로 정의한 Queue. Serial & Concurrent 모두 가능하나 보통 Serial 작업 수행. Main과 구분해 사용이 필요할 때 사용
userInteractive
userInitiated
default
utility
background
unspecified
sync는 작업이 끝날 때까지 기다리기 때문에 UI 업데이트는 main thread의 async만 사용 가능하다.
raywenderlich 예제에서는 UI 업데이트를 위해 아래와 같이 코드를 작성하고 있다.
DispatchQueue.global(qos: .userInteractive).async {
forLoop("선행 작업")
DispatchQueue.main.async {
print("선행 작업 후 UI 변경")
}
}
이렇게 하면 서버에서 데이터를 받아오거나, 사전에 처리해야할 부분이 있을 경우 UI업데이트를 자연스럽게 할 수 있다고 한다!
출처 :
GCD 정리
GCD에 대해서 알아보기