DispatchWorkItem 활용하기

윤지하·2025년 9월 7일
0

swift

목록 보기
7/9

이번에 사이드 프로젝트에서 토스트 기능을 구현하던 도중 토스트가 화면에 있는 동안 다른 토스트가 불리면 어떻게 해야 할까를 고민하던 도중 DispatchWorkItem가 있다는 것을 알게 되어 사용해 보았습니다.

DispatchWorkItem이란?

DispatchWorkItem은 Grand Central Dispatch(GCD)에서 제공하는 클래스로, 취소 가능한 작업을 나타냅니다. 일반적인 DispatchQueue.main.asyncAfter와 달리 실행 전에 작업을 취소할 수 있는 기능을 제공합니다.

기본 사용법

// 작업 생성
let workItem = DispatchWorkItem {
    print("3초 후 실행될 작업")
}

// 작업 예약
DispatchQueue.main.asyncAfter(deadline: .now() + 3, execute: workItem)

// 필요시 취소
workItem.cancel()

DispatchWorkItem을 활용한 토스트 제어

저같은 경우는 이런식으로 사용을 해봤습니다.

class ToastManager: ObservableObject {
    @Published var isShowing = false
    @Published var message = ""
    
    private var hideWorkItem: DispatchWorkItem?
    
    func showToast(_ text: String, duration: TimeInterval = 3.0) {
        // ✅ 기존 타이머 취소
        hideWorkItem?.cancel()
        
        message = text
        isShowing = true
        
        // ✅ 새 타이머 설정
        hideWorkItem = DispatchWorkItem { [weak self] in
            DispatchQueue.main.async {
                self?.isShowing = false
            }
        }
        
        DispatchQueue.main.asyncAfter(deadline: .now() + duration, execute: hideWorkItem!)
    }
    
    func hideImmediately() {
        hideWorkItem?.cancel()
        isShowing = false
    }
}

마무리

DispatchWorkItem은 iOS 개발에서 취소 가능한 지연 실행이 필요한 상황에서 매우 유용한 도구인 것 같습니다.

핵심은 "기존 작업을 취소하고 새 작업을 예약"하는 패턴에서 빛을 발한다는 점입니다. Timer나 Combine 같은 다른 방법들과 비교했을 때, 단순한 지연 실행 + 취소 시나리오에서는 DispatchWorkItem이 가장 간단하고 효율적인 선택이라고 생각합니다.


이 글이 도움이 되셨다면 댓글이나 공유 부탁드립니다. 궁금한 점이 있으시면 언제든 질문해주세요! 🙂

profile
성장하고 싶은 개발자

0개의 댓글