我目前有一组要触发的网络请求。 问题是我需要对它们的结果进行排序以符合我解雇它们的顺序。
我当前的代码如下:
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 个 URL 的数组,我一个接一个地触发请求 (1,2,3,4...)。
我需要以相同的顺序返回这些请求的结果(R1、R2、R3、R4,其中 R1 是来自请求 1 等的响应...),以便将图像存储在结果数组中。
我可以等全部完成。没问题。
最佳答案
无需对原始代码进行太多更改,您可以通过在 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
的更多信息
关于swift - 使用 RxSwift 订购网络请求结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55296667/