iOS/Swift
[Swift] GCD(Grand Central Dispatch)
HarryJeonn
2022. 11. 14. 13:03
GCD에 대해서 알아보자!
GCD
Thread 갯수, 코어 갯수, 동기/비동기화 같은 기능을 쉽게 접근하여 일을 처리하는 API
DispatchQueue
Queue에 담긴 각 아이템은 스레드 풀에 의해 처리된다.
1. Main
Main Thread에서 처리되는 Serial Queue
모든 UI 작업은 Main Queue에서 수행되어야 함
1-1. Global
전체 시스템에 공유되는 Concurrent Queue
QoS 파라미터 제공한다.
1-2. Custom
Serial Queue를 만들고 싶을 때 사용, Global Queue에서 실행된다.
2. Serial
이전 작업이 끝나면 다음 작업이 순차적으로 진행
2-1. Concurrent
병렬 형태로 진행
3. Sync
Queue에 집어넣은 데이터들이 끝날 때 까지 코드 진행이 멈춘다.
3-1. Async
Queue에 집어넣은 데이터들이 끝나지 않아도 코드가 진행된다.
DispatchQueue.main.async {
// main thread, async
// ...
}
DispatchQueue.global.sync {
// global thread, sync
// ...
}
DispatchQueue(label: "myQueue").async {
// main thread, async
// ...
}
4. asyncAfter
시간을 주고 그 시간 후에 해당 작업을 하라는 의미
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// ...
}
QoS (Quality of Service)
작업 시 우선 순위에 따라 처리하는데 이 중요도를 미리 정의한 개념이 QoS
어떤 작업을 Multi-threading으로 Concurrent하게 처리하고자 할 때 사용 (Global Queue)
QoS 우선 순위
- userInteractive
- 유저 입장에서 가장 빠른 결과를 기대
- 유저가 버튼을 tap할 시 바로 작동, Global Queue이지만 Main Thread에서 실행
- userInitiated
- 유저 입장에서 조금 빠른 결과를 기대
- Async하게 처리
- default
- background에서 실행
- utility
- 유저 입장에서 기다리는 정도의 기대
- 계산, 입출력 등
- background
- 유저 입장에서 실행되는지 몰라도 되는 정도의 바로 필요하지 않은 기대
- unspecified
정리
장점
- OperationQueue에 비해 GCD가 가볍다.
- 스레드 관리와 실행에 대한 책임을 애플리케이션 레벨에서 운영체제 레벨로 넘김
- 스레드를 직접 생성하고 관리하는 것에 비해 관리 용이, 성능 향상
동작 방식
- 앱을 실행하면 시스템이 자동으로 메인스레드 위에서 동작하는 Main Queue(Serial Queue)를 만들어서 작업을 수행, 그 외에 여러개의 Global Queue(Cuncurrent Queue)를 추가적으로 만들어서 관리
Queue 종류
- Dispatch Queues
- FIFO 순서로 작업을 실행시키는 역할을 담당
- Serial Dispatch Queue
- 한번에 한 작업만 실행
- Concurrent Dispatch Queue
- 시작한 작업이 끝나는 것을 기다리지 않고 많은 작업을 실행
- Main Dispatch Queue
- 메인 스레드에서 작업을 실행할 수 있는 전역에서 사용 가능한 Serial Queue
- DispatchQueue.main
- Main thread queue, Serial queue로 동작
🧐
어째서일까.. 비동기적으로 처리해야할 때는 Global Queue를 사용했고, 그걸 UI 업데이트하려고 할 때는 Main Queue에서 당연하게 사용했던 것 같다.
요즘 다시 복습하는 겸 정리를 할수록 구현하기 위해서 사용했지 제대로 이해하지 못한 것이 많은 것 같다.
이제라도 알았으니 다음부터는 더 알고 쓰자!