[Swift] Dispatch Group

2025. 2. 23. 17:40·iOS/Swift
728x90
반응형

안녕하세요, iOS 개발하는 루피입니다!

 

오늘은 Dispatch Group에 대해 공부해 보겠습니다.

 

바로 시작합니다.


Dispatch Group 이란?

여러 작업을 하나의 단위로 묶어서 관리하고 모니터링할 수 있게 해 주는 도구입니다.

쉽게 말해, 여러 작업이 모두 끝날 때까지 기다리거나 그 진행 상황을 한꺼번에 파악하고 싶을 때 사용할 수 있는 기능입니다.

 

순서를 간략하게 정리해 보겠습니다!!

  1. 그룹은 여러 작업을 하나로 묶어서 관리하고, 그 그룹에 맞춰 동작을 동기화할 수 있게 해 줍니다.
  2. 여러 개의 작업 항목을 그룹에 추가한 뒤, 같은 큐나 서로 다른 큐에서 비동기적으로 실행되도록 설정해 줍니다.
  3. 모든 작업 항목이 실행을 마치면 그룹은 완료 핸들러를 실행합니다. 또는 그룹 내 모든 작업이 끝날 때까지 동기적으로 기다릴 수도 있습니다.

1. notify()

현재 그룹에 속한 모든 작업이 끝나면, 지정한 속성과 함께 특정 큐에서 블록을 실행하도록 스케줄링해 줍니다.

그리고 해당 알림 블록이 실행된다면 그룹은 비워지게 됩니다.

func notify(
    qos: DispatchQoS = .unspecified,
    flags: DispatchWorkItemFlags = [],
    queue: DispatchQueue,
    execute work: @escaping () -> Void
)

func notify(
    queue: DispatchQueue,
    work: DispatchWorkItem
)

매개변수 (Parameters)

  • qos : 이 작업의 우선순위를 정하는 Quality of Service 클래스예요. 얼마나 급한 작업인지 시스템에 알려주는 거죠.
  • flags : 작업을 어떻게 실행할지에 대한 옵션이에요. 보통은 기본값으로 두면 되는데, 특수한 제어가 필요할 때 쓰입니다.
  • queue : 그룹의 작업이 다 끝난 뒤에 블록을 실행할 큐를 지정해요. UI 업데이트라면. main, 다른 계산 작업이라면. global() 같은 큐를 선택합니다.
  • work : 그룹이 완료되면 실행할 실제 작업이에요. 이 블록에 하고 싶은 코드를 넣으면 됩니다.

2. Wait()

동기적으로 이전에 제출된 작업이 끝나기를 기다립니다.

3. enter()

블록이 그룹 안에 들어왔음을 명시적으로 나타냅니다.

 

Objective-C에서 enter()를 호출하면, 그룹에 남아 있는 작업 수 카운트가 하나 늘어나게 됩니다.

dispatch_group_async 대신 직접 작업을 추가하거나 제거하는 방식으로 그룹을 관리할 때, 이 함수와 leave()를 같이 써서 작업 수를 제대로 추적할 수 있게 해 줍니다.  enter()를 호출한 건 반드시 leave()로 짝을 맞춰줘야 하며, 이 함수를 사용하면 하나의 작업 블록을 여러 그룹에 동시에 연결할 수도 있습니다.

4. leave()

그룹 안에 있는 블록의 실행이 끝났음을 명시적으로 나타냅니다.

 

leave()를 호출하면 그룹에 남아 있는 작업 수 카운트가 하나 줄어듭니다.

dispatch_group_async를 사용하지 않고 직접 작업을 추가하거나 제거할 때, enter()와 함께 써서 작업 수를 제대로 관리할 수 있게 해 줍니다. enter()를 호출한 만큼 leave()를 호출해서 균형을 맞춰야 합니다.


예시 코드

import SwiftUI

struct ContentView: View {
    let animationGroup = DispatchGroup() // 그룹을 생성합니다.
    let serialQueue = DispatchQueue(label: "serialQueue")

    @State private var view1Color: Color = .clear
    @State private var view2Color: Color = .clear
    @State private var showSheet: Bool = false

    var body: some View {
        VStack {
            Rectangle()
                .fill(view1Color)
                .frame(height: 200)
                .padding()

            Rectangle()
                .fill(view2Color)
                .frame(height: 200)
                .padding()

            Button("Start Animation") {
                startAnimations()
            }
            .foregroundStyle(.black)
            .tint(.yellow)
            .buttonStyle(BorderedButtonStyle())
            .frame(width: 200, height: 60)
            .font(.title3)
        }
        .sheet(isPresented: $showSheet) {
            Text("애니메이션 완료!")
                .font(.title)
        }
    }

    func startAnimations() {
        // 파란색 애니메이션
        animationGroup.enter() // Group에 추가합니다.
        serialQueue.async {
            withAnimation(.linear(duration: 1.5)) {
                self.view1Color = .blue
                print("파란색 시작: \(Thread.current)")
            }

            Thread.sleep(forTimeInterval: 1.5) // 애니메이션 완료 대기
            self.animationGroup.leave() // Group에서 빠졌습니다.
        }

        // 초록색 애니메이션
        animationGroup.enter() // Group에 추가합니다.
        serialQueue.async {
            withAnimation(.linear(duration: 1.5)) {
                self.view2Color = .green
                print("초록색 시작: \(Thread.current)")
            }

            Thread.sleep(forTimeInterval: 1.5)
            self.animationGroup.leave() // Group에서 빠졌습니다.
        }

        // Group 에 있는 모든 작업이 완료 되면 해당 동작을 실행합니다.(main 큐에서)
        animationGroup.notify(queue: .main) {
            print("모두 완료: \(Thread.current)")
            self.showSheet = true
            self.view1Color = .clear
            self.view2Color = .clear
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

오늘도 화이팅입니다!

728x90
반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] 동시성 vs 병렬성  (0) 2025.02.26
[Swift] Dispatch Work Item  (0) 2025.02.24
[Swift] Dispatch Queue 종류  (0) 2025.02.21
[Swift] Concurrent + Sync 에 대한 궁금증  (0) 2025.02.19
[Swift] DispatchQueue  (0) 2025.02.19
'iOS/Swift' 카테고리의 다른 글
  • [Swift] 동시성 vs 병렬성
  • [Swift] Dispatch Work Item
  • [Swift] Dispatch Queue 종류
  • [Swift] Concurrent + Sync 에 대한 궁금증
kimsangjunzzang
kimsangjunzzang
루피 님의 블로그 입니다.
  • kimsangjunzzang
    루피 님의 블로그
    kimsangjunzzang
  • 전체
    오늘
    어제
    • 분류 전체보기 (91) N
      • iOS (55)
        • Swift (26)
        • UIKit (9)
        • SwiftUI (8)
        • RxSwift (12)
      • FE (8)
        • 모던 자바스크립트 (3)
        • HTML (5)
      • Operating System (1)
      • 트러블 슈팅 (4) N
      • 바로 안 나오면 모르는거다 (4)
      • Algorithm (16)
      • 회고록 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Algorithm
    디자인 패턴
    closure
    swift
    uikit
    CS
    C++
    오블완
    FP
    rxswift
    면접
    gcd
    life cycle
    ViewController
    주니어 개발자
    boj
    티스토리챌린지
    회고록
    web
    알고리즘
    AppleDeveloperAcademy
    HTML
    DispatchQueue
    state
    JavaScript
    백준
    SwiftUI
    ios
    arc
    Delegate
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
kimsangjunzzang
[Swift] Dispatch Group
상단으로

티스토리툴바