develop

GCD 본문

iOS

GCD

pikachu987 2021. 2. 6. 21:24
반응형

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
Comments