GCD
- Grand Central Dispatch
- C 기반
- Background 에서 Thread 를 관리하면서 동시적으로 작업을 실행시키는 저수준 API 를 제공하는 라이브러리
- 앱을 실행하면 시스템에서 기본적으로 2개의 Queue (Main Queue & Global Queue) 를 만들어 준다.
Dispatch Queue
- FIFO (First In First Out) 구조로 작업을 실행시킨다.
- Serial Dispatch Queue 와 Concurrent Dispatch Queue 로 나눌 수 있다.
- sync 와 async 메소드를 가지고 있다.
- Apple 공식 문서
Serial Dispatch Queue
- 직렬 처리
- 등록된 작업을 한번에 하나씩 차례대로 처리한다.
- 처리 중인 작업이 완료되면 다음 작업을 처리한다.
let serialQueue = DispatchQueue(label: "myQueue.serial")
Concurrent Dispatch Queue
- 병렬 처리
- 시작한 작업이 끝나는 것을 기다리지 않고 가능한 많은 작업을 실행한다.
- 등록된 작업을 한번에 하나씩 처리하는 것이 아니라 여러 작업들을 동시에 처리한다.
let concurrentQueue = DispatchQueue(label: "myQueue.concurrent", attributes: .concurrent)
Main Queue
- 메인 스레드 (UI 스레드) 에서 사용되는 Serial Queue
- 모든 UI 처리는 메인 스레드에서 처리해야 한다.
let mainQueue = DispatchQueue.main
Global Queue
- 편의상 사용할 수 있게 만들어둔 Concurrent Dispatch Queue
- 처리 우선 순위를 위한 qos (Quality of Service) 파라미터를 제공한다.
- 병렬적으로 동시에 일을 처리하기 때문에 작업 완료 순서는 정할 수 없지만 우선적으로 일을 처리하게 할 순 있다.
let globalQueue = DispatchQueue.global(qos: .background)
qos 파라미터 (우선 순위 설정)
DispatchQueue.global(qos: .userInteractive)
- userInteractive
- 가장 높은 순위
- 즉시 완료해야 하는 작업
- 애니메이션 / 이벤트 처리 / UI 업데이트
DispatchQueue.global(qos: .userInitiated)
- userInitiated
- 사용자가 앱을 적극적으로 사용하지 못하도록 한다.
DispatchQueue.global()
DispatchQueue.global(qos: .utility)
- utility
- 사용자가 적극적으로 추적하지 않는 작업에 사용된다.
DispatchQueue.global(qos: .background)
- background
- 유지 보수 / 정리 태스크
DispatchQueue.global(qos: .unspecified)
sync 메소드
- 동기 처리 메소드
- 해당 작업을 처리하는 동안 다음으로 진행되지 않고 계속 머물러 있다가 해당 작업 처리가 완료되면 그 다음으로 넘어간다.
- 시간이 꽤 걸리는 큰 작업이거나 언제 끝날지 알 수 없는 작업인 경우에는 작업이 처리되는 동안 아무 동작도 하지 않고 있기 때문에 앱이 렉에 걸리거나 아무 반응이 없는 것처럼 보이기 때문에 이 경우에는 sync 메소드를 웬만하면 쓰지 않는다.
DispatchQueue.main.sync {
print("SYNC METHOD 실행중 ~~")
}
print("SYNC METHOD 실행 끝 !")
- [코드 5] 를 실행하면 'SYNC METHOD 실행중 ~~' 이 무조건 먼저 출력되고 그 다음에 'SYNC METHOD 실행 끝 !' 이 출력된다.
async 메소드
- 비동기 처리 메소드
- 처리하라고 지시한 후 다음으로 넘어가 버린다.
- 시간이 꽤 걸리는 큰 작업이거나 언제 끝날지 알 수 없는 작업 (ex. 네트워크, 파일 로딩 작업) 에 주로 사용된다.
DispatchQueue.global(qos: .background).async {
print("ASYNC METHOD 실행중 ~~")
}
print("ASYNC METHOD 실행 끝 !")
- [코드 6] 을 실행하면 'ASYNC METHOD 실행 끝 !' 이 무조건 먼저 출력되고 그 다음에 'ASYNC METHOD 실행중 ~~' 이 출력된다.
참고