swift 快速合并取消发布者没有任何可取消的

wgeznvg7  于 2023-01-19  发布在  Swift
关注(0)|答案(2)|浏览(239)

我有一个基于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就永远不会被触发。

nuypyhwy

nuypyhwy1#

我需要的是在用户注销时取消所有网络请求的能力。
我建议你设置一个发布器,在用户退出时发出,然后在你的API系统中,你可以使用prefix(untilOutputFrom: logoutPublisher)
这样,当logoutPublisher发出时,您的所有网络请求都将取消。

xam8gpfp

xam8gpfp2#

sink方法返回一个AnyCancellable,您可以将其存储在请求的专用属性中,而不是将可取消项存储在数组中。
当您需要取消订阅时,只需取消初始化可取消的订阅,因为根据documentation,“AnyCancellable示例在取消初始化时自动调用cancel()”。

private var requestCancellable: AnyCancellable?

func setUpSubscription() {
    requestCancellable = request
        .sink(receiveCompletion: { _ in
            print("subscription2 completed")
        }, receiveValue: { image in
            print("subscription1 value: \(image.scale)")
        })
}

func cancelSubscription() {
    requestCancellable = nil
}

相关问题