왜 갑자기 GCD가 나오느냐면, 간단한 인터벌 타이머 어플을 하나 만들면서 UI 업데이트와 사운드 재생의 딜레이를 해결할 때 GCD를 이용했기 때문...
Execute code concurrently on multicore hardware by submitting work to dispatch queues managed by the system.
시스템이 관리하는 디스패치 큐에 작업을 제출하여 멀티코어 하드웨어에서 코드를 동시에 실행하도록 하는 프레임워크
라고 애플 공식 문서에서 설명하고 있습니다.
DispatchQueue.global(qos: .userInteractive).async {
self.playSound?("CoachReadySound")
}
DispatchQueue.main.async {
self.timerTick?("\(String(format: "%02d", remainMin)) : \(String(format: "%02d", remainSec))")
}
일단 기본적으로 Queue는 FIFO의 특성을 갖고 있는 자료 구조입니다. 작업을 하나씩 queue에 넣으면 먼저 들어간 작업이 먼저 실행되는...
DispatchQueue.main.async
: 큐에 보낸다.(어떤 큐에?)메인 큐에.비동기적으로
라고 알면 되는 것 같습니다.
DispatchQueue.global().async
: 큐에 보낸다.(어떤 큐에?)글로벌 큐에.비동기적으로
라고 받아들였습니다.
global()
처럼 생성자가 붙어서 사용되는 것 같습니다.qos
라는 것을 정의해줄 수 있습니다.GCD에서 사용하는 QoS는 실행될 작업의 중요도를 매겨주는 enum(열거형 변수)입니다.
QoS를 사용함으로 인해, 작업의 중요도를 나누고 자원을 효율적으로 사용할 수 있게 됩니다.
QoS로 사용할 수 있는 값들에는 아래와 같은 6가지 값들이 있습니다.
userInteractive
: 애니메이션, 이벤트 핸들링이나 UI 업데이트 같은 작업들이 가져야하는, 가장 최상위의 QoS 값입니다.userInitiated
: 사용자가 시작한 후, 바로 처리해야 하는 작업에 부여할 수 있는 QoS 값입니다. 해당 작업이 끝나기 전까지는 유저가 상호작용할 수 없습니다.default
utility
: 사용자가 활발히 살펴보지 않아도 되는 작업에 부여할 수 있는 QoS 값입니다.background
: 개발자가 생성한 작업을 유지하거나 정리하는 작업에 부여할 수 있는 QoS 값입니다.unspecified
: QoS값을 부여하지 않는 QoS 값입니다.앞으로 비동기적으로 작업을 수행해야할 때, 적절한 QoS값을 사용해서 코드를 작성하는 것이 중요할 것 같네요!