애플에서 제공하는 스레딩처리 API GCD(Grand Central Dispatch)에 대해서 알아보겠습니다.
GCD는 C기반의 저수준 API입니다.
DispatchQueue
GCD를 사용하기 전에 먼저 알아야 할 클래스가 있습니다.
DispatchQueue 클래스 인데요.
실제로 해야할 Task를 담아두면 선택된 스레드에서 실행을 해주는 역할을 합니다.
DispatchQueue는 2가지로 종류로 나눌수 있습니다.
Serial Dispatch Queue와 Concurrent Dispatch Queue입니다.
• Serial Dispatch Queue
Serial Queue는 등록된 작업을 한번에 하나씩 차례대로 처리 합니다.
처리중인 작업이 완료되면 다음 작업을 처리합니다.
• Concurrent Dispatch Queue
Concurrent Queue는 등록된 작업을 한번에 하나씩 처리 하지 않고
여러 작업들을 동시에 처리합니다.
앱 실행시 시스템에서 기본적으로 2개의 Queue를 만들어 줍니다.
Main Queue와 Global Queue 입니다.
main dispatch queue는 앱의 main 쓰레드에서 task를 실행하는, 전역적으로 사용 가능한 serial queue입니다.
Global Queue는 Concurrent queues(일종의 global dispatch queue라고도 알려진)로, 동시에 하나 이상의 task를 실행하지만 task는 큐에 추가된 순서대로 게속 시작됩니다. 현재 실행중인 task는 dispatch queue에서 관리하는 고유한 쓰레드에서 실행됩니다.
let mainQueue = DispatchQueue.main
print(mainQueue) // Main Queue
let globalQueue = DispatchQueue.global(qos: .background)
print(globalQueue) // Global Queue
• Main Queue
메인 스레드(UI 스레드)에서 사용 되는 Serial Queue 입니다.
모든 UI 처리는 메인 스레드에서 처리를 해야 합니다.
애플문서에 따르면 메인 큐에서는 sync를 사용하면 데드락이 발생할 수 있기 때문에 , 메인 큐에서 sync는 사용하지 않습니다.
• Global Queue
편의상 사용할수 있게 만들어 놓은 Concurrent Queue 입니다.
Global Queue는 처리 우선 순위를 위한 qos(Quality of service)
파라메터를 제공합니다.
병렬적으로 동시에 처리를 하기때문에 작업 완료의 순서는 정할수 없지만
우선적으로 일을 처리하게 할수 있습니다.
let globalQueue = DispatchQueue.global(qos: .background)
globalQueue.async {
print("value: 1")
}
print("value: 2")
// 결과
/*
value: 2
value: 1
*/
QOS 우선순위는 아래와 같습니다.
userInteractive
userInitiated
default
utility
background
unspecified
위에 나와있는 순서대로 global 인자 qos에 넣어주면 우선순위를 정해주고 이에 따라 스케줄링 해줍니다
sync / async
Dispatch Queue는 sync와 async라는 메소드를 가지고 있습니다.
동기, 비동기라는 말을 많이 들어 보셨을 겁니다.
sync는 동기 처리 메소드 입니다.
해당 작업을 처리하는 동안 다음으로 진행되지 않고
계속 머물러 있습니다.
시스템에서 제공하는 Main Queue로 테스트를 해보겠습니다.
async는 비동기 처리 메소드 입니다.
sync와는 다르게 처리를 하라고 지시후 다음으로 넘어가 버립니다.
이번에는 시스템에서 제공하는 Global Queue로 테스트를 해보겠습니다.
간혹 가다가 오해하는 분들이 계신데
Serial / Concurrent와 sync / async 는 별개 입니다.
직렬인데 비동기 일수도 있고, 병렬인데 동기 일수도 있습니다.
직렬과 병렬은 한번에 하나만 처리하느냐 동시에 여러개 처리하느냐고
동기와 비동기는 처리가 끝날때까지 기다리느냐
지시만하고 다른 처리를 하느냐 입니다.
'🌙 iOS 스터디 > iOS' 카테고리의 다른 글
[iOS] Firebase 파이어베이스 (0) | 2021.03.12 |
---|---|
[iOS] URLSession Alamofire (0) | 2021.03.03 |
[ios] 비동기 (Async) vs 동기 (Sync) 와 직렬 vs 동시처리 (0) | 2021.02.24 |
[xcode] 유용한 단축키 모음 ( - 지속적 업데이트 중) (0) | 2021.01.19 |
[xcode] extension 언제 사용? (0) | 2021.01.19 |