-
Concurrency & Threadingios/Etc 2022. 4. 8. 14:37728x90
모든 작업들은 스레드라고 불리는 곳에서 실행되고 있다.
스레드는 고속도로와 같다고 생각하면 될 것 같다.
차선들은 스레드이고, 이동 중인 차량은 실행되는 작업이다.
1차선은 비교적 깔끔하고 빠르게 이동해야 하는 곳이고 나머지 차선들은 1차선에 비해 그렇지 않다.
1차선은 메인 스레드이고 나머지 차선은 백그라운드 스레드라고 생각하면 될 것 같다.
메인 스레드를 빠르고 깨끗하게 유지해야 하는 이유는 UI가 수행되는 곳이기 때문이다.
만약 메인 스레드가 시간 집약적인 작업으로 막히게 되면 사용자는 앱이 제대로 동작하지 않다고 생각하게 될 것이다.
따라서 우리는 무거운 작업들을 백드라운 스레드에서 수행해서 메인 스레드를 여유롭게 두어 UI가 응답할 수 있도록 해야 한다.
이 조건들을 만족하기 위해서 메인 스레드와 백그라운드 스레드를 관리하는 것은 아주 까다롭고 어려워질 수 있다.
하지만 다행히도 Apple은 스레드 위에 GCD(Grand Central Dispatch)와 NSoperation Queues라는 API를 구축하여 스레드를 생성하고 관리하는 무거운 작업들을 처리해준다. 우리가 큐형태로 작업하면 이를 GCD에 제공하고, GCD는 모든 스레드 관리 작업을 처리한다.
GCD는 다음과 같은 Queue를 제공하고 있다.
SERIAL QUEUE(직렬성) & CONCURRENT QUEUE(동시성)
SERIAL QUEUE
- 선입선출 구조로 먼저 들어온 작업 다 끝나야 작업이 진행되는 구조
- 한 번에 하나씩 발생
- 예측이 가능한 실행 순서
- Race Condition 방지
- 속도가 느림
- 메인 스레드
CONCURRENT QUEUE
- 앞 작업이 다 끝날 때까지 기다릴 필요가 없이 동일한 순서대로 시작되는 작업 구조
- 속도가 빠름
- 작업이 어떻게 끝나는지 예측할 수 없다.
- 의존성이 있는 작업(실행 순서가 팔 수적인 작업)에서는 좋지 못하다.
- 백그라운드 스레드
메인 스레드에서 Concurrent하게 사용하고 싶은 경우
tableView를 채우기 위해서 인터넷에서 JSON 데이터를 받고 있다고 가정해보자.
다운로드가 완료되면 데이타를 보여주기 위해서 tableView를 reload 해야는데 다운로드는 백그라운드 스레드에서 진행되기 때문에 메인 스레드로 이동하여 UI에 업데이트할 것이다.
코드로 작성하면 다음과 같다.
DispatchQueue.main.async { self.tableView.reloadData() }
백그라운드 스레드에서 메인 스레드로 dispatch 하여 reaload 하는 코드이다.
만약 반대로 어떤 작업을 백그라운드 스레드로 보내고 싶다면 다음과 같이 작성하면 된다.
DispatchQueue.global(qos: .background).async { // Code to run on background queue }
참고:
"iOS Concurrency and Threading - iOS Interview Question" by Sean Allen https://youtu.be/iTcq6L-PaDQ
https://developer.apple.com/documentation/dispatch/dispatchqueue
728x90'ios > Etc' 카테고리의 다른 글
Info.plist (0) 2022.05.18 @escaping (0) 2022.05.14 Swift 메모리 관리: ARC (0) 2022.03.22 GoF Design Pattern (0) 2022.03.06 Cocoa란?(Feat. iOS, macOS) (0) 2022.03.05