[내일배움캠프 5주차 (01/27)]

yeseul jang·2026년 1월 27일

내일배움캠프

목록 보기
7/32

Swift Concurrency & Dispatch Queue

📌 왜 이런 게 필요할까?

  • iOS 앱은 기본적으로 메인 스레드 하나로 그리다보니 네트워크 요청, JSON 파싱, 이미지 다운로드 같은 오래 걸리는 작업을 메인 스레드에서 하면 앱이 멈춘 것처럼 보임 (스크롤 안 됨, 터치 안 먹힘)

  • 일은 백그라운드에서 하고, UI만 메인에서하도록 가능하게 해주는 게 Concurrency(동시성)

💡Dispatch (GCD)

– 옛날부터 쓰던 방식

  • GCD (Grand Central Dispatch) : 애플이 제공하는 스레드 관리 시스템
  • 직접 스레드를 만들지 않고 Queue(대기열)에 작업을 던짐

🔎 사용예시

1️⃣ Queue

  • Main Queue: UI 작업 전용 (유일함)

  • Global Queue: 백그라운드 작업용

2️⃣ sync / async

  • sync: 끝날 때까지 기다림 (잘 안 씀)
  • async: 던지고 바로 다음 줄 실행 (보통 이걸 사용)
DispatchQueue.global().async { // 백그라운드 작업 - 긴 시간걸리는 것들 바로실행
    let result = heavyWork()
    DispatchQueue.main.async { // main으로 UI 업데이트 바로 실행
        self.label.text = result
    }
}
  • 언제 메인으로 돌아오는지 눈으로 직접 관리
  • 클로저 중첩 → 코드 길어짐
  • 실수하면 데드락, UI 버그 생김

💡Swift Concurrency(iOS 15+)

🔎 개념

  • 비동기 코드를 동기 코드처럼 쓰자는 의도로 애플이 공식적으로 만든 언어 차원의 동시성 시스템
  • async, await, Task, @MainActor

🔎 사용예시

func fetchData() async -> String {
    return "Hello"
}

Task {
    let data = await fetchData()
    print(data)
}
  • async: 중간에 멈출 수 있는 함수임을 알림
  • await: 여기서 잠깐 기다리는 것을 알려줌
@MainActor
func updateUI(text: String) {
    label.text = text
}
  • 이 함수는 무조건 메인 스레드에서 실행됨을 알림
  • Dispatch에서 DispatchQueue.main.async와 같음

📌 차이점

  • Dispatch는 직접 스레드 관리함 -> 코드 실수 시 오류가 발생하면 그대로 버그
  • Swift ConcurrencySwift가 대신 관리함
profile
iOS 개발

0개의 댓글