develop
GCD 본문
GCD(GrandCentralDispatch)
구현이 아주 간단하고 대부분 GCD 방식으로 사용하고 있다.
2021/01/18 - [iOS] - DispatchGroup 으로 GCD로 만든 것들을 그룹화 할 수도 있다.
GCD는 Main큐와 Global큐가 시스템으로 만들어져 있다.
그리고 Queue를 직접 만들수 있다.
DispatchQueue.main.async {
print("main Queue isMainThread: \(Thread.isMainThread)")
}
DispatchQueue.global().async {
print("global Queue isMainThread: \(Thread.isMainThread)")
}
let queue = DispatchQueue(label: "CustomQueue")
queue.async {
print("Create Queue isMainThread: \(Thread.isMainThread)")
}
global Queue isMainThread: false
Create Queue isMainThread: false
main Queue isMainThread: true
그리고 sync(동기)와 async(비동기)가 있다. (2021/01/10 - [iOS] - Blocking, Non-blocking)
로직이 동작할때는 Serial(직렬), Concurrent(병렬)로 동작하는데
DispatchQueue를 만들때 attributes에 concurrent 값을 줄 수 있다.
Serial은 sync로 하거나 queue를 만들어 여러 async를 주면 된다.
Concurrent
public convenience init(label: String, qos: DispatchQoS = .unspecified, attributes: DispatchQueue.Attributes = [], autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit, target: DispatchQueue? = nil)
let queue = DispatchQueue(label: "CustomQueue", qos: .default, attributes: .concurrent)
queue.async {
print("Create Queue isMainThread: \(Thread.isMainThread)")
}
Create Queue isMainThread: false
Serial
let queue1 = DispatchQueue(label: "CustomQueue1")
queue1.sync {
print("sync")
}
sync
let queue2 = DispatchQueue(label: "CustomQueue2")
queue2.async {
print("async1")
}
queue2.async {
print("async2")
}
async1
async2
DispatchQoS는
- userInteractive: 유저 사용성을 위해 즉시 수행. UI, 이벤트처리, 애니메이션 등에
- userInitiated: 비동기 UI에서 수행.
- default: 기본
- utility: 지속적인 작업이 필요할때 사용. 효율적이다.
- background: 시간에 상관없는 작업을 수행할 때 사용. 언제 수행할지는 GCD가 컨트롤
Dispatch를 Group로 묶을수 있다. 2021/01/18 - [iOS] - DispatchGroup
Semaphore를 사용하여 Race Condition이 일어나는 현상을 막을 수 있고 Thread Safe하게 동작하게 할 수 있다. 2021/01/09 - [iOS] - Semaphore
DispatchWorkItem으로 GCD와 같이 사용할수도 있다. 2021/02/03 - [iOS] - DispatchWorkItem
정리
직렬로 실행되는 시리얼큐와 병렬로 실행되는 컨커런트큐가 있다.
그리고 UI와 관련된 작업을 할 수 있는 main 쓰레드 큐와 ui를 제외한 작업에서 사용되는 global쓰레드 큐가 있다.
main 쓰레드큐는 serial큐로 동작되고 global 글로벌큐는 컨커런트큐로 동작된다.
그리고 몇가지의 작업 우선순위를 줄 수 있다.
필요성은 이미지 다운로드와 같이 오래 걸리는 작업을 처리하려면 해당 작업이 끝날때 까지 화면이 프리징상태가 되는데 프리징상태가 되지 않게 하기 위해 사용한다.
'iOS' 카테고리의 다른 글
iOS에서 srt, smi 파일 한글 깨지는 문제 (0) | 2021.03.01 |
---|---|
UITableView UICollectionView Reorder (0) | 2021.02.07 |
OperationQueue (0) | 2021.02.05 |
Thread (0) | 2021.02.04 |
DispatchWorkItem (0) | 2021.02.03 |