swift - 使用 RxSwift 订购网络请求结果

标签 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 个 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/

相关文章:

ios - TableView 在 API 请求更新模型之前加载单元格

swift - Rxswift + Moya + Moya-ObjectMapper 错误处理

ios - Rx swift : How to create cache for last network response without creating class/struct property?

ios - RxCocoa-observable 正在从 API 发出新数据,但 tableview.rx.items 不显示新数据

swift - 自定义 NSTableView 表头、背景色、去除边框

ios - Swift:未设置请求授权 header

arrays - 在 Swift 中从数组中抓取 N 批而不超出范围?

swift - 无法实例化类 _TtC12STracker23InfoInterfaceController

swift - Rx swift : enable/disable button based on textfields are not empty

ios - 在 RxSwift 中解析 JSON 并处理来自 API 的错误响应