使用 RxSwift 订购网络请求结果

Order network requests result with RxSwift

我目前有一组网络请求要触发。 问题是我需要对它们的结果进行排序以符合我解雇它们的顺序。

我当前的代码如下:

for url in config.fieldImages.map ({ URL(string: [=10=])! }) {
    self.getWheelFieldImage(url: url)
        .takeUntil(.inclusive, predicate: { (_) -> Bool in
            images.count == config.fieldImages.count - 1
        })
        .subscribe(onNext: { (anImage) in
            images.append(anImage)
        }, onError: { (error) in
            completion(nil, nil, error)
        }, onCompleted: {
            completion(images, false, nil)
            self.lastUpdate = Date()
        }, onDisposed: {
    })
    .disposed(by: self.disposeBag)
}

我想知道是否有一种简单的方法可以使用 RxSwift.

以我解雇它们的相同顺序对这些结果进行排序

编辑:

我试着更好地解释这个问题。我有这个包含 N 个 URL 的数组,我一个接一个地触发请求 (1,2,3,4...)。

我需要以相同的顺序(R1、R2、R3、R4,其中 R1 是请求 1 等的响应...)返回这些请求的结果,以将图像存储在结果数组中。

我可以等全部完成。没问题。

无需对原始代码进行太多更改,您可以通过在网址列表中使用 enumerated() 来实现此目的:

/// Prefill your images with nil for each image
var images = Array<Int?>(repeating: nil, count: config.fieldImages.count)
for (index, url) in config.fieldImages.map ({ URL(string: [=10=])! }).enumerated() {
    self.getWheelFieldImage(url: url)
        .takeUntil(.inclusive, predicate: { (_) -> Bool in
            images.count == config.fieldImages.count - 1
        })
        .subscribe(onNext: { (anImage) in
            images[index] = anImage /// Store on proper position
        }, onError: { (error) in
            completion(nil, nil, error)
        }, onCompleted: {
            completion(images, false, nil)
            self.lastUpdate = Date()
        }, onDisposed: {
    })
    .disposed(by: self.disposeBag)
}

可能大多数 RxWay 将使用 zip 运算符作为:

let streams = config.fieldImages
    .map { URL(string: [=11=])! }
    .map { self.getWheelFieldImage(url: [=11=]) }
let images = Observable.zip(streams) // Observable<[UIImage]>
    .subscribe(
        onNext: { [weak self] images in
            completion(images, false, nil)
            self?.lastUpdate = Date()
        }, 
        onError: { error in
            completion(nil, nil, error)
        }
    )
    .disposed(by: self.disposeBag)

您可以在 documentation

中阅读有关 zip 的更多信息