Итак, несмотря на мой комментарий о контексте, который может иметь большое значение, вот как я могу асинхронно конвертировать [A]
в [B]
, используя ReactiveSwift. Обратите внимание, что у меня не было возможности протестировать этот код, но он должен понять основную идею:
// This function takes an `NSURL` and creates an asynchronous `SignalProducer` to
// download an image from that URL or yields `nil` if there is an error.
func downloadImage(url: URL) -> SignalProducer<UIImage?, NoError> {
let request = URLRequest(url: url)
return URLSession.shared.reactive.data(with: request)
.map { (data, response) -> UIImage? in UIImage(data: data) }
.flatMapError { _ in SignalProducer<UIImage?, NoError>(value: nil) }
}
func convertAToB(_ a: A) -> SignalProducer<B, NoError> {
let imgDownload = downloadImage(url: a.imageURL)
let thumbDownload = downloadImage(url: a.thumbnailURL)
return SignalProducer<UIImage?, NoError>.combineLatest(imgDownload, thumbDownload)
.map { images in
return B(name: a.name, image: images.0, thumbnail: images.1)
}
}
func convertAllAsToBs(_ inputs: [A]) -> SignalProducer<[B], NoError> {
return SignalProducer<A, NoError>(values: inputs)
.flatMap(.concat, convertAToB)
.collect()
}
let inputs: [A] = ...
convertAllAsToBs(inputs).startWithValues { outputs in
// `outputs` is [B]
}
Edit:
Чтобы привести этот ответ в соответствие с ответом @ PhilippeC RxSwift, вот краткое изложение того, что делает каждый оператор ReactiveSwift:
SignalProducer.init(values:)
является эквивалентом Observable.from
RxSwift. Он создает производителя, который отправляет каждое значение последовательности как отдельное событие.
collect
является эквивалентом toArray
RxSwift. Он собирает каждое значение от источника-источника и отправляет их вместе в одном массиве после завершения работы источника-источника.
flatMap
запускает продюсера convertAToB
для каждого входящего A
и объединяет результат в соответствии с указанным FlattenStrategy
. В этом случае я использовал .concat
, что делает его эквивалентным RxSwift concatMap
, который объединяет каждый результат и сохраняет порядок, как @PhilippeC описывает в своем ответе.