使用RxSwift

时间:2019-03-22 09:36:31

标签: swift rx-swift

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

我当前的代码如下:

for url in config.fieldImages.map ({ URL(string: $0)! }) {
    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个网址的数组,然后依次触发请求(1,2,3,4 ...)。

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

我可以等所有人完成。没问题。

1 个答案:

答案 0 :(得分:2)

您无需对原始代码进行太多更改,就可以通过在URL列表上使用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: $0)! }).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: $0)! }
    .map { self.getWheelFieldImage(url: $0) }
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的更多信息