使用switchToLatest

switchToLatest的使用场景是当短时间内多次发送类似数据流请求时,会取消前面的请求,只响应最后一次。

switchToLatest保留最后一个publisher,在实际开发中,特别适合用于过滤搜索框的多余的网络请求。

let subject = PassthroughSubject<Int, Never>()

cancellable = subject
    .setFailureType(to: URLError.self)
    .map() { index -> URLSession.DataTaskPublisher in
        let url = URL(string: "https://example.org/get?index=\(index)")!
        return URLSession.shared.dataTaskPublisher(for: url)
    }
    .switchToLatest()
    .sink(receiveCompletion: {
        print("Complete: \($0)")
    }, receiveValue: { (data, response) in
        guard let url = response.url else {
            print("Bad response.")
            return
        }
        print("URL: \(url)")
    })

for index in 1...5 {
    DispatchQueue.main.asyncAfter(deadline: .now() + TimeInterval(index / 10)) {
        subject.send(index)
    }
}

打印结果如下:

URL: https://example.org/get?index=5

Made with in Shangrao,China By 老雷

Copyright © devler.cn 1987 - Present

赣ICP备19009883号-1