2021 CS193P 강의를 참고하여 작성되었습니다.
Threads
하나의 실행 단위입니다.
프로그램 내에서 실행되는 것이 있을 텐데, 그 실행되는 것 하나하나가 모두 스레드입니다.
iOS에서 실행되는 스레드는 계속 변경됩니다.
실행되는 스레드 간의 변경이 아주 빠르게 처리해서, 사용자에게는 여러 작업이 동시에 일어나는 것처럼 보이도록 합니다.
아이폰에서 유튜브를 보면서 카카오톡 알림이 오는 것도 다른 스레드들이 계속 스위칭되면서 진행되는 것입니다.
스레드마다 우선 실행권한을 가질 수 있다.
Queues
쓰레드는 시간적 개념이 들어가 있기 때문에 코드로 작성해서 이해하는 것이 어렵습니다.
Swift에서는 이것을 큐들을 이용해서 해결했습니다.
큐는 실행할 스레드를 순서대로 줄 세워서 처리하게 만듭니다.
개발자가 고려할 것은 적절한 큐에 작업을 넣어주기만 하면 됩니다.
iOS에서 사용되는 큐는 다음과 같습니다.
- Main Queue
UI와 관련된 큐입니다. UI와 관련된 작업은 모두 이 큐에 넣어야 합니다.
main queue는 단일 스레드로 처리한다. 즉 큐에 있는 작업은 순서대로 처리됩니다.
- Background Queues
처리되는데 시간이 오래 걸리고 UI와 관련 없는 작업을 위한 큐입니다.
여러 스레드를 병렬적으로 처리할 수 있습니다. 그래서 작업들 간의 순서를 확정할 수 없습니다.
이 background queue는 main UI queue와 함께 병렬적으로 실행됩니다.
background queue에서도 quality of service에 따라 어떤 작업이 먼저 실행될지 지정할 수 있습니다.
하지만 main queue가 항상 더 높은 실행 권한을 가집니다.
GCD(Grand Central Dispatch)
Main queue, background queue를 이용하기 위한 API입니다.
대표적으로 제공하는 기능은 queue에 접근하는 것과 queue에 작업을 넣는 것입니다.
Main Queue는 DispatchQueue.main로 접근할 수 있습니다.
Background Queues는 DispatchQueue.global(qos: QoS)로 접근할 수 있습니다.
QoS(Quaility of Service)로 background queue의 작업 수행의 우선순위를 지정할 수 있습니다.
QoS 종류
- .userInteractive : UI와 관련된 작업. ex) 드래그를 할 때 처리되어야 하는 작업
- .userInitiated : 유저가 수행을 요청했을 때 수행해야 하는 작업 ex) 유저가 버튼을 눌러서 처리되어야 하는 작업
- .utility : 유저가 요청한 건 아닌데 수행해야 하는 작업
- .background : 그 외
사용방법
let queue = DispatchQueue.main or DispatchQueue.global(qos:)
queue.async { queue에 넣을 작업 }
queue.sync { queue에 넣을 작업 }
sync : 큐에 넣은 작업이 끝날 때까지 다른 것을 실행하지 않겠다(block)입니다. sync로 처리하면 다른 작업들을 처리할 수 없기 때문에 UI작업도 동작하지 않습니다.
async : 작업을 queue에 넣고 끝냅니다. 작업은 queue에서 시스템에 의해서 알아서 dispatch 되고 run 될 것입니다.
new GCD
강의 설명에 자그마하게 GCD가 2021년 WWDC에서 발표된 새로운 것으로 교체되었다고 합니다.
Note: GCD has been mostly replaced by Swift's new built-in async API as of WWDC 2021.
CS193p 코드에서 변경된 내용을 반영해보겠습니다.
https://developer.apple.com/videos/play/wwdc2021/10132/
Reference
https://developer.apple.com/documentation/dispatch/dispatchqueue
https://cs193p.sites.stanford.edu/
'iOS > iOS' 카테고리의 다른 글
[iOS, concurrency] publishing changes from background threads is not allowed; (0) | 2021.11.25 |
---|---|
[SwiftUI] some View의 some에 대해서 (1) | 2021.11.23 |
[Swift] Struct 그리고 Class (0) | 2021.10.26 |
iOS 📱 개발에 유용한 사이트 정리 (0) | 2021.09.23 |