取消订阅 Combine 框架

Canceling subscription Combine framework

当应用程序在 Combine 框架中进入后台时,我们是否可以取消 dataTaskPublisher?

只需发送 .cancel() 给订阅者。这是一个演示 class

class Downloader: ObservableObject{
    var cancellable: AnyCancellable?
    let url: URL

    init(url: URL){
        self.url = url
    }

    func download(){
        cancellable = URLSession.shared.dataTaskPublisher(for: url)
        // ... other operators code
    }
    
    func cancel() {
        self.cancellable?.cancel()
        self.cancellable = nil
    }
}

如果您想将取消行为直接嵌入到 Combine 发布商运营商链中,那么 prefix(untilOutputFrom:) 会有所帮助:

let url: URL = ...
cancellable = URLSession.shared.dataTaskPublisher(for: url)
    .prefix(untilOutputFrom: NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification))
    .sink(receiveCompletion: {
        print([=10=])
    },receiveValue: {
        print([=10=])
    })

这将启动数据任务,但如果 UIApplication.willResignActiveNotification 被触发则取消它。我没有看到很多人使用这个运算符,可能是因为它的命名不好,但它是其他响应式框架(例如 ReactiveSwift)中的常见模式,其中运算符被更明智地命名为 take(until:).