GCD: Grand Central Dispatch
- 멀티코어 시스템에서 concurrent 실행을 제공하는 프로그래밍 언어 요소
- DispatchQueue 는 Swift 의 GCD 중 하나이다.
Serial, Concurrent
Serial
큐에 추가된 순서대로 한번에 하나의 task를 실행한다.
DispatchQueue("myLabel")
Concurrent
운영체제는 DispatchQueue에서 꺼낸 현재 작업이 끝나지 않더라도, 다음 작업을 다른 스레드에 할당시켜 실행한다.
DispatchQueue(label: "", attributes: .concurrent)
DispatchQueue (Main, Global, Custom)
Main dispatch Queue(DispatchQueue.main)
- 앱의 메인 쓰레드에서 Task를 실행하는 단 하나뿐인, 전역적으로 사용 가능한 serial queue이다.
- 화면 위에 보여지는 앱 요소(UI 업데이트 등) 는 메인 스레드에서 이루어진다.
따라서 UI업데이트와 관련된 작업은 메인 큐에서 할당되어야 한다. - 메인 스레드는 하나이기 때문에 DispatchQueue.main.sync 를 호출하면 안된다.(앱이 뻗는다..)
DispatchQueue.global(qos: DispatchQoS.QoSClass = default)
- 글로벌 큐의 경우 concurrent 특성을 가진다. 따라서 여러개의 스레드에 분산되어 작업을 실행한다.
- global은 qos(quality of service) 파라미터를 받는다.qos 의 종류(큐의 중요도를 Enum 파라미터로 넣을 수 있다.)
userInteractive
userInitiated
default
utility
background
unspecified
Custom Queue
let myQueue = DispatchQueue(label: "myQueue")
- 이렇게 label 파라미터만 주면 Serial Queue가 생성 된다.
let myQueue = DispatchQueue(label: "myQueue", attributes: .concurrent)
- 이렇게 명시적으로 지정을 해줘야 concurrentQueue 가 생성이 된다.
Sync, Async
앞에서 설명했던 Serial과 Concurrent는 큐에 대한 속성으로, task 실행을 하나의 스레드에 몰아서 순차적으로 주느냐, 여러개의 스레드에게 주느냐. 즉 스레드의 이용에 대한 부분이다.
Sync와 Async는 큐로 넘겨지는 각각 단일task가 실행되면, task가 끝까지 종료되고 리턴되느냐(sync) 즉시 리턴되느냐(async)의 차이이다.
'IOS' 카테고리의 다른 글
SwiftUI onDelete 수정자 사용 (0) | 2023.02.25 |
---|---|
SwiftUI ViewBuilder란 (0) | 2023.02.17 |
ObservableObject 와 Codable 같이 사용하기 (0) | 2022.12.31 |
Swift enum (0) | 2022.12.31 |
Swift 에러 핸들링 (try, catch, throw, throws, do) (0) | 2022.12.28 |