我有一个基于Combine的网络库。我可以在应用中的任何地方发出请求,网络库返回一个发布者,但它无法访问创建的、实际触发管道的AnyCancellable。我需要的是在用户注销时取消所有网络请求的能力。是否有办法从发布者而不是AnyCancellable取消Combine管道?
下面是一个例子:
var subscribers = [AnyCancellable]()
let url = URL(string:"https://www.apeth.com/pep/manny.jpg")!
let request: AnyPublisher<UIImage, URLError> = URLSession.shared.dataTaskPublisher(for: url)
.compactMap { UIImage(data:$0.data) }
.share()
.eraseToAnyPublisher()
request
.sink(receiveCompletion: { _ in
print("subscription2 completed")
}, receiveValue: { image in
print("subscription1 value: \(image.scale)")
})
.store(in: &subscribers)
// request.cancel()
我想在发布者上调用类似request.cancel()的函数,这样receiveValue就永远不会被触发。
2条答案
按热度按时间nuypyhwy1#
我需要的是在用户注销时取消所有网络请求的能力。
我建议你设置一个发布器,在用户退出时发出,然后在你的API系统中,你可以使用
prefix(untilOutputFrom: logoutPublisher)
。这样,当logoutPublisher发出时,您的所有网络请求都将取消。
xam8gpfp2#
sink
方法返回一个AnyCancellable
,您可以将其存储在请求的专用属性中,而不是将可取消项存储在数组中。当您需要取消订阅时,只需取消初始化可取消的订阅,因为根据documentation,“
AnyCancellable
示例在取消初始化时自动调用cancel()
”。