Swift

Swift - DispatchQueue

iosos 2023. 8. 22. 21:11

DispatchQueue

- Grand Central Dispatch (GCD)라는 다중 스레딩 라이브러리를 사용하여 멀티스레딩 작업을 조율하고 관리하는데 사용되는 개념 

- 즉, 작업 항목의 실행을 관리하는 클래스 

- 일반 스레드 보다 쉽고 효울적으로 코드를 작성할 수 있음

- 보통 서버에서 데이터를 받고 이미지 동영상을 외부에서 다운로드 및 처리할 때 CPU 사용량이 많아 처리를 메인 스레드가 아닌 별도의 스레드에서 처리한 뒤 메인 스레드에 결과만 전달하여 CPU를 효율적을 사용 가능 

 

 

종류

1. Serial Queue 

- 작업들이 순차적으로 실행되는 대기열

- 한 번에 하나의 작업만 실행되며, 한 작업이 끝나야 다음 작업이 실행됨 

 

2. Concurrent Queue

- 여러 작업이 동시에 실행될 수 있는 대기열

- 작업 간에 순서는 보장되지 않음 

- 대기열에 있는 작업을 동시에 별도의 스레드를 사용하여 실행함

 


 

 

GCD에서 제공하는 Queue

*  Main(serial)

- 메인 스레드에서 처리되며, UIKit, SwiftUI의 모든 요소들은 Main Queue에서 수행되어야 함

 

* Global(Concurrent)

- 시스템 전체에 공유되며, 병렬적으로 동시에 실행이 되긴 하지만 QoS를 통해 우선순위를 정할 수 있음

- 우선 순위가 높은 작업은 낮은 순위의 작업보다 더 빨리 실행되며, 이를 잘 이용하면 빠르고 렉 없는 앱을 만들 수 있음 

 

QoS(Quality of Service)
- DispatchQueue에서 수행할 작업을 분류하기 위해 사용
- QoS를 지정해두어 중요도를 표시하고 시스템이 우선순위를 정하고 이에 따라 스케쥴링

 

 

우선 순위 : userInteractive -> unspecified 순으로 낮음 

DispatchQueue.global(qos: .userInteractive) {}  // Main Queue
DispatchQueue.global(qos: .userInitiated) {}    // 유저가 시작한 작업, 유저가 응답을 기다림
DispatchQueue.global(qos: .default) {}          // userInitiated 와 utility 의 중간 값
DispatchQueue.global(qos: .utility) {}          // 시간이 걸리며 즉각적인 응답이 필요하지 않은 경우
DispatchQueue.global(qos: .background) {}       // 눈에 보이지 않는 부분의 작업. 완료 시간 중요 X
DispatchQueue.global(qos: .unspecified) {}

 


 

* Sync : Synchronously 동기

- 작업이 다 끝난 다음에만 현재의 Queue에게 컨트롤을 넘김

- 현재의 Queue는 block 상태가 되어 그 작업이 끝날 때까지 대기

 

 

* Async : Asynchronously 비동기

- 작업을 수행할 다른 Queue에게 작업을 넘김과 동시에 현재의 Queue에게 컨트롤을 돌려줌 

- 작업이 끝나기 전까지 기다릴 필요 없고 동기와 반대로 block 상태가 되지 않음 

 

 

 

Sync 사용

 DispatchQueue.global(qos: .background).sync {
    for item in 1...10{
        print("sync : \(item)")
    }
}

for item in 100...105{
    print(item)
}

- sync 문이 모두 실행된 이후 다음 코드가 실행됨

 

 

 

Async 사용

DispatchQueue.global(qos: .background).async {
    for item in 1...10{
        print("sync (1) : \(item)")
    }
}

DispatchQueue.global(qos: .background).async {
    for item in 50...60{
        print("sync (2) : \(item)")
    }
}

for item in 100...110{
    print(item)
}

- Async는 동시에 처리되기 때문에 섞여서 print 됨 

 

 

 

 

참고)

https://seons-dev.tistory.com/entry/Swift-DispatchQueue%EB%9E%80-GCD-Grand-Central-Dispatch 

 

'Swift' 카테고리의 다른 글

Swift - Class, Struct, Enum  (0) 2023.08.23
Swift - mutating  (0) 2023.08.22
Swift - UserDefaults  (0) 2023.08.16
Swift - 키보드 올라옴 감지(NotificationCenter, Observer 사용)  (0) 2023.08.11
Swift - 프로토콜 (Protocol)  (0) 2023.08.06