使用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