iOS 앱은 기본적으로 메인 스레드 하나로 그리다보니 네트워크 요청, JSON 파싱, 이미지 다운로드 같은 오래 걸리는 작업을 메인 스레드에서 하면 앱이 멈춘 것처럼 보임 (스크롤 안 됨, 터치 안 먹힘)
일은 백그라운드에서 하고, UI만 메인에서하도록 가능하게 해주는 게 Concurrency(동시성)
Dispatch (GCD)– 옛날부터 쓰던 방식
GCD (Grand Central Dispatch) : 애플이 제공하는 스레드 관리 시스템QueueMain Queue: UI 작업 전용 (유일함)
Global Queue: 백그라운드 작업용
sync / asyncsync: 끝날 때까지 기다림 (잘 안 씀)async: 던지고 바로 다음 줄 실행 (보통 이걸 사용)DispatchQueue.global().async { // 백그라운드 작업 - 긴 시간걸리는 것들 바로실행
let result = heavyWork()
DispatchQueue.main.async { // main으로 UI 업데이트 바로 실행
self.label.text = result
}
}
Swift Concurrency(iOS 15+)async, await, Task, @MainActorfunc fetchData() async -> String {
return "Hello"
}
Task {
let data = await fetchData()
print(data)
}
@MainActor
func updateUI(text: String) {
label.text = text
}
Dispatch에서 DispatchQueue.main.async와 같음Dispatch는 직접 스레드 관리함 -> 코드 실수 시 오류가 발생하면 그대로 버그Swift Concurrency는 Swift가 대신 관리함