일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- singleton
- Git
- viewlifecycle
- 글또
- NotificationCenter
- struct
- escaping
- CoreImage
- apns
- SWIFTUI
- Observer
- Refresh
- class
- uikit
- Switch
- SWIFT
- self
- PushNotification
- 고차함수
- calendar
- 화면전환
- ScrollView
- mvvm
- array
- error
- segue
- IOS
- Animation
- list
- http
- Today
- Total
seong_hye, the developer
SwiftUI) DispatchGroup에 대해 알아보기 본문
📘DispatchGroup
GCD(Grand Central Dispath)의 기능 중 하나로, 여러 비동기 작업들을 그룹으로 묶어서
전부 끝났을 때를 감지하거나 동기적으로 기다렸다가 다음 코드르 실행할 때 사용
비동기 작업들의 완료를 추적하고 조율하는 데 사용됨
(각 작업이 언제 시작하고 완료되는지 추적하여 모든 작업이 완료된 시점을 감지할 수 있음)
🔹기능
- 여러 개의 비동기 작업(큐에 올라가는 블록)을 그룹핑
- 모든 작업이 끝났ㅇ르 떄 알림(Notify)를 받거라, 동시 대기(Wait) 가능
- 네트워크 요청, 파일 I/O, 연산 등 여러 작업을 동시에 처리하고 결과를 합쳐야 할 때 유용
🔹주요 메서드
enter() / leave()
그룹에 "작업 시작" 알림, 카운터를 증가시킴 ~> enter()
그룹에 "작업 끝남" 알림, 작업이 완료됨을 알림, 카운터를 감소시킴 ~> leave()
짝이 맞아야 함 (enter 호출 횟수 == leave 호출 횟수)
gruop.notify(queue:closure)
그룹 안의 모든 작업이 끝나면 지정된 큐에서 클로저를 호출
group.wait()
현재 스레드를 블록하여 그룹의 모든 작업이 끝날 때까지 대기
( ⚠️ 메인스레드에서 사용시 UI 멈춤 ~> 비권장)
~> (timeout:)의 경우 지정된 시간까지만 기다리고 타임아웃이 발생하면 결과를 반환함
🔹예시 코드
비동기 네트워크 요청 여러 개 병렬
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로 대기 가능
'IOS > SwiftUI' 카테고리의 다른 글
SwiftUI) sound 기능 (0) | 2025.08.19 |
---|---|
SwiftUI) 이미지 채도, 명도 조절해보기 (0) | 2025.08.05 |
Swift) Image Crop에 대해 알아보기 (0) | 2025.07.28 |
SwiftUI) Path에 대해 알아보기 (0) | 2025.07.21 |
SwiftUI) 이미지(사진) 권한 설정에 대해 알아보기 (0) | 2025.07.15 |