Вы также можете использовать prepend(_:)
метод для наблюдаемого, который создает каскадную последовательность, которая, я полагаю, похожа на Observable.concat(:)
в RxSwift .
Вот простой пример, который я пытался смоделировать в вашем случае использования, где у меня есть несколько различных последовательностей, которые следуют друг за другом.
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 МБ файла, затем 50 МБ и, наконец, 1 МБ, так как сначала начинается последний добавленный файл, и так далее.
Существует другой вариант оператора prepend(_:)
, который принимает массив, но, похоже, не работает последовательно.