본문 바로가기

Programming/Swift

[Swift] 취소 가능한 Task를 설정하는 방법 (feat. AnyCancelTaskBag)

반응형

Task를 여러개 등록한 Class가 있다고 가정할때, 이들의 작업이 모두 완료 되기 전에 Class를 닫아야할 경우가 생깁니다.

이때 진행중인 작업을 즉시 완료 하고, 메모리에서 해제하고 싶을 때가 있는데요

Combine은 .store를 통해 여러개의 subject를 등록하고 Class해제 시점에 같이 해제 시켜줄 수 있는데요

class AnyClass {
    private var subject = PassthroughSubject<String, Never>()
    private var cancellables: [AnyCancellable] = []

    init() {
        subject
            .sink { [weak self] text in
                guard let self = self else { return }

            }.store(in: &self.cancellables)
    }
}

Task도 Combine의 .store() 처럼

Task를 등록하고 해제 시점에 자동으로 task가 해제되는게 있으면 어떨까 싶었는데

마침 아래 블로그에서 이에 대한 해법을 제시해주셨습니다.

http://minsone.github.io/swift-concurrency-AnyCancelTaskBag

 

[Swift 5.7+][Concurrency] Task의 CancelTaskBag 구현하기

Swift의 Concurrency에서 Task를 이용해서 비동기 작업을 처리합니다. Task { try await Task.sleep(nanoseconds: 10 * 1_000_000_000) print("Hello") } 하지만, Task로 비동기 작업 도중에 Task를 실행한 객체가 사라지거나 할

minsone.github.io

class AnyClass {
    let bag = AnyCancelTaskBag()

    func foo() {
        Task {
            // Impl
        }.store(in: bag)
    }
}

이후 Class 주기와 함께 맞출 필요가 있는 Task는 위 처럼 사용하면 깔끔하게 해결 될 것 같습니다.

반응형