일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Animation
- Observer
- SWIFT
- PushNotification
- 글또
- 화면전환
- NotificationCenter
- apns
- calendar
- protocol
- singleton
- IOS
- 고차함수
- struct
- uikit
- Git
- class
- self
- SWIFTUI
- mvvm
- ScrollView
- list
- array
- http
- Switch
- error
- viewlifecycle
- segue
- Refresh
- escaping
- 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 멈춤 ~> 비권장)
🔹예시 코드
비동기 네트워크 요청 여러 개 병렬
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 |
---|---|
nfc 관련 내용 정리 (0) | 2025.08.12 |
Swift) Image Crop에 대해 알아보기 (0) | 2025.07.28 |
SwiftUI) Path에 대해 알아보기 (0) | 2025.07.21 |
SwiftUI) 이미지(사진) 권한 설정에 대해 알아보기 (0) | 2025.07.15 |