seong_hye, the developer

SwiftUI) DispatchGroup에 대해 알아보기 본문

IOS/SwiftUI

SwiftUI) DispatchGroup에 대해 알아보기

seong_hye 2025. 8. 26.

 

📘DispatchGroup

GCD(Grand Central Dispath)의 기능 중 하나로, 여러 비동기 작업들을 그룹으로 묶어서

전부 끝났을 떄를 감지하거나 동기적으로 기다렸다가 다음 코드르 실행할 때 사용


🔹기능

- 여러 개의 비동기 작업(큐에 올라가는 블록)을 그룹핑

- 모든 작업이 끝났ㅇ르 떄 알림(Notify)를 받거라, 동시 대기(Wait) 가능

- 네트워크 요청, 파일 I/O, 연산 등 여러 작업을 동시에 처리하고 결과를 합쳐야 할 때 유용


 

🔹주요 메서드

enter() / leave()

그룹에 "작업 시작" 알림 ~> enter()

그룹에 "작업 끝남" 알림 ~> leave()

짝이 맞아야 함 (enter 호출 횟수 == leave 호출 횟수)

 

gruop.notify(queue:closure)

그룹 안의 모든 작업이 끝나면 호출

 

group.wait()

현재 스레드에서 그룹의 모든 작업이 끝날 때까지 대기

( ⚠️ 메인스레드에서 사용시 UI 멈춤 ~> 비권장)


🔹예시 코드

비동기 네트워크 요청 여러 개 병렬

func fetchData() {
	let group = DispatchGruop()
    
    var result1: String?
    var result2: String?
    
    group.enter()
    DispatchQueue.global().async {
    	sleep(2)
        result1 = "첫 번째 결과"
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
    	sleep(3)
        result2 = "두 번째 결과"
        group.leave()
    }
    
    group.notify(queue: .main) {
    	print("모두 완료: \(result1!), \(result2!)")
    }
}
// 출력

//(3초 뒤)
//모두 완료: 첫 번째 결과, 두 번째 결과

 

동기 대기

let group = DispatchGroup()

group.enter()
DispatchQueue.globle().async {
	print("작업 1 시작")
    sleep(2)
    print("작업 1 완료")
    group.leave()
}

group.enter()
DispatchQueue.globle().async {
	print("작업 2 시작")
    sleep(1)
    print("작업 2 완료")
    group.leave()
}

group.wait() 	// 모든 leave가 끝날때까지 대기 (메인스레드에서는 사용 못 함)

print("모든 작업 완료 후 실행")
// 출력

// 작업 1 시작
// 작업 2 시작
// 작업 2 완료
// 작업 1 완료
// 모든 작업 완료 후 실행

🔹사용하는 경우

- 여러 API를 동시에 호출하고, 모두 끝난 후 UI 업데이트

- 여러 파일을 읽고 저장한 뒤 한 번에 결과 합치기

- 비동기 작업들의 동시 완료 시점이 필요할 때

- 기존 completion handler를 여러 개 조합해야 할 때 깔끔한 코드 구조를 유지하기 위해


 

🔹주의 할 점

- enter()와 leave() 호출은 반드시 짝이 맞아야 함

- wait()는 UI 메인 스레드에서는 사용하지 않는 게 원칙 (앱이 멈춰버림)

- DispatchGroup은 작업 실행 순서 제어가 아니라 완료 시점 감지용임

~> 순서를 보장하기 위해서는 DispatchQueue.asyncAfter 또는 OperationQueue를 고려해야 함


🔹정리

DispatchGroup = 여러 비동기 작업을 묶어서 완료를 한 번에 감지

enter / leave를 사용해 그룹에 등록 후 notify로 모든 작업 끝 난 시점 콜백

wati로 대기 가능


Comments