Swift: GCD - DispatchGroup

Wooyo·2023년 10월 27일
0
post-thumbnail

1. DispatchGroup

  • 비동기적으로 처리되는 작업들을 묶는 기능
  • async들을 묶어서 그룹의 작업이 끝나는 시점을 추적 / 어떠한 동작을 수행
  • DispatchGroup은 async에서만 사용 가능
  • notify, wait, enter, leave이 존재

2. group 등록 - enter / leave

  • DispatchGroup은 초기화 구문이 없음
  • DispatchGroup 사용방법
- async를 호출하면서 파라미터로 group 지정
- enter / leave를 코드 앞 뒤로 호출하여 group 지정
  • enter / leave는 DispatchGroup이 enter() 부터 leave()까지 포함된다 라는 의미
let group = DispatchGroup()

// enter, leave를 사용하지 않는 경우
DispatchQueue.main.async(group: group) {}
DispatchQueue.global().async(group: group) {}

// enter, leave를 사용하는 경우
group.enter()
DispatchQueue.main.async {}
DispatchQueue.global().async {}
group.leave()

3. 추척 - notify

  • DispatchGroup의 처리가 끝나는 시점에 원하는 동작을 수행하기 위한 메서드
let red = DispatchWorkItem {
    for _ in 1...5 {
        print("🥵🥵🥵🥵🥵")
        sleep(1)
    }
}

let yellow = DispatchWorkItem {
    for _ in 1...5 {
        print("😀😀😀😀😀")
        sleep(1)
    }
}

let blue = DispatchWorkItem {
    for _ in 1...5 {
        print("🥶🥶🥶🥶🥶")
        sleep(2)
    }
}

let group = DispatchGroup()

DispatchQueue.global().async(group: group, execute: blue)
DispatchQueue.global().async(group: group, execute: red)

// group.enter()
// DispatchQueue.global().async(execute: blue)
// DispatchQueue.global().async(execute: red)
// group.leave()

group.notify(queue: .main) {
    print("모든 작업이 끝났습니다.")
}

4. 수행대기 - wait

  • DispatchGroup의 수행이 끝나기 기다리는 메서드
  • notify와 달리 별도의 코드플록을 실행하지 않음
  • queue 지정필요 없음
  • timeout 파라미터 설정 가능, 지정시간 후에도 작업종료가 되지 않는다면 더 이상 기다리지 않고 다음 코드 실행
let group = DispatchGroup()

DispatchQueue.global().async(group: group, execute: blue)
DispatchQueue.global().async(group: group, execute: red)

group.wait()
print("모든 작업이 끝났습니다.")

// group.wait(timeout: 10)
// print("모든 작업이 끝났습니다.")
profile
Wooyo의 개발 블로그

0개의 댓글