取消订阅 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:)
.
当应用程序在 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:)
.