티스토리 뷰
그동안 GCD의 개념을 잘못 이해하고 있어 제대로 각인시키고자 블로그를 작성해봅니다.
아래 코드에서 동작순서는 어떻게 되고 어떤게 먼저 끝나는지 헷갈렸던 부분이 있었습니다.

헷갈렸던 코드
let queue = DispatchQueue.global()
queue.async {
task1()
task2()
task3()
}
//Task 1 시작
//Task 1 완료★
//Task 2 시작
//Task 2 완료★
//Task 3 시작
//Task 3 완료★
이전에는 async 내부의 로직들이 비동기로 처리되는줄 알고 있었습니다..🫠
위 로직의 실행 순서
task1 → task2 → task3
코드블럭 { } 안에 있는 로직들은하나의 task로 보기때문에 순서대로 실행이 됩니다.
task가 하나이기 때문에 아래의 그림과 같은 모양인거죠

그럼 아래의 경우에는?

답
Task 1 시작
Task 2 시작
Task 3 시작
Task 2 완료★
Task 1 완료★
Task 3 완료★
먼저 이 그림을 보고 답을 예측해봅시다

task가 총 3개고,
globalQueue 특성상 여러 thread에 task를 할당하며,
async 특성상 task의 작업이 끝나길 기다리지 않고 다른 작업을 실행하므로
결과는 아래와 같습니다.
let queue = DispatchQueue.global()
queue.async {
task1()
}
queue.async {
task2()
}
queue.async {
task3()
}
//Task 1 시작
//Task 2 시작
//Task 3 시작
//Task 2 완료★
//Task 1 완료★
//Task 3 완료★
SerialQueue의 경우는 하나의 Thread에만 task를 할당합니다.
그럼 SerialQueue.sync, SerialQueue.async 각각 결과는 어떻게 나올까?
SerialQueue sync
let serialQueue = DispatchQueue(label: "serial")
serialQueue.sync {
task1()
}
serialQueue.sync {
task2()
}
serialQueue.sync {
task3()
}
아래의 사진처럼 SerialQueue는 한 Thread에 task를 할당 합니다.

결과

그럼 SerialQueue.async는 어떻게 될까요.
SerialQueue.async
let serialQueue = DispatchQueue(label: "serial")
serialQueue.async {
task1()
}
serialQueue.async {
task2()
}
serialQueue.async {
task3()
}
async라 헷갈릴수도 있지만 SerialQueue의 역할을 생각해보면 결국은 아래와 같은 순서입니다.

결과

하나의 Thread에서 처리되기때문에 async라도 순서대로 진행이 되죠.
마지막으로 GlobalQueue.sync의 경우는 어떻게 될까요.
GlobalQueue.sync
let globalQueue = DispatchQueue.global()
globalQueue.sync {
task1()
}
globalQueue.sync {
task2()
}
globalQueue.sync {
task3()
}
GlobalQueue 특성상 여러 Thread에 task를 할당하지만,
sync로 앞의 작업이 끝날때까지 기다리게 되므로 동작방식은 아래 사진과 같습니다.

결과

그동안 잘못 알고 사용해왔던 부분을 이제와서라도 다시 짚고 넘어갈 수 있게돼서 다행인것 같습니다. ㅠㅠㅠ
이외에도 비동기처리방식으로 RxSwift를 사용하고있는데 남이 쓴 코드를 복붙하기보다 이해하고 내것으로 만들어서 써야겠다는 생각이 다시 들었습니다.
이유있는 코드를 작성하도록 노력해야겠습니다.
'iOS' 카테고리의 다른 글
| [iOS] Tuist (feat. xcproj 충돌) (5) | 2024.09.02 |
|---|---|
| [SwiftUI] @StateObject와 @ObservedObject의 차이점 (2) | 2024.07.25 |
| [iOS] ITMS-91053: Missing API declaration (Privacy Manifests) (0) | 2024.04.10 |
| [iOS] CoreData (1) | 2024.03.17 |
| [iOS] 빌드 환경에 따른 분기처리 (Dev, Release) (2) | 2024.01.20 |
- Total
- Today
- Yesterday
- 원티드 프리온보딩
- swift property
- Class
- swift reduce
- Swift Error Handling
- 2023년 회고
- iOS error
- Swift 프로퍼티
- Swift 내림차순
- Swift 프로그래머스
- Swift joined()
- CS 네트워크
- Swift inout
- Combine: Asynchronous Programming with Swift
- swift 고차함수
- Swift RIBs
- swift (programmers)
- Swift joined
- RIBs tutorial
- swift programmers
- Swift init
- Swift final
- removeLast()
- Swift ModernRIBs
- ios
- Swift Leetcode
- RTCCameraVideoCapturer
- Swift
- Swift 알고리즘
- swift protocol
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |