您还可以在 observable 上使用prepend(_:)
方法来创建连接序列,我想这与RxSwiftObservable.concat(:)
中的类似。
这是一个简单的示例,我试图模拟您的用例,其中我有几个不同的序列,然后是另一个序列。
func dataTaskPublisher(_ urlString: String) -> AnyPublisher<(data: Data, response: URLResponse), Never> {
let interceptedError = (Data(), URLResponse())
return Publishers.Just(URL(string: urlString)!)
.flatMap {
URLSession.shared
.dataTaskPublisher(for: $0)
.replaceError(with: interceptedError)
}
.eraseToAnyPublisher()
}
let publisher: AnyPublisher<(data: Data, response: URLResponse), Never> = Publishers.Empty().eraseToAnyPublisher()
for urlString in [
"http://ipv4.download.thinkbroadband.com/1MB.zip",
"http://ipv4.download.thinkbroadband.com/50MB.zip",
"http://ipv4.download.thinkbroadband.com/10MB.zip"
] {
publisher = publisher.prepend(dataTaskPublisher(urlString)).eraseToAnyPublisher()
}
publisher.sink(receiveCompletion: { completion in
print("Completed")
}) { response in
print("Data: \(response)")
}
在这里,prepend(_:)
运算符为序列添加前缀,因此,前置序列首先开始,完成,下一个序列开始。
如果您运行下面的代码,您应该会看到首先下载了 10 MB 的文件,然后是 50 MB,最后是 1 MB,因为最后一个前置文件首先开始,依此类推。
运算符的其他变体prepend(_:)
采用数组,但这似乎不是按顺序工作的。