我目前有一组要触发的网络请求。 问题是我需要对它们的结果进行排序以适应我解雇它们的顺序。
我当前的代码如下:
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的响应等)来取回这些请求的结果,以将图像存储在结果数组中。>
我可以等所有人完成。没问题。
答案 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
的更多信息