如何使用Moya RxSwift合并REST数组

时间:2019-05-31 19:11:16

标签: swift rx-swift moya

我正在尝试学习RxSwift。我一直在使用Moya,现在想在RxSwift尝试一下。完全困惑。

 let popServiceProvider = MoyaProvider<PopRESTService>()
    let o1 = popServiceProvider.rx.request(.getPopByCity(city: "London")).asObservable()
    let o2 = popServiceProvider.rx.request(.getPopByCity(city: "Tokyo")).asObservable()

    let pObservables:[Observable<Response>] = [o1, o2]
    let stats: Observable<Response> = Observable.combineLatest(pObservables)
    let m = stats.map({ a in
        print(a)
    })  

首先,我在let stats上遇到错误:

无法将'Observable <[Response]>'类型的值转换为指定的'Observable'类型

我什至朝着正确的方向前进吗?

2 个答案:

答案 0 :(得分:0)

我建议使用Observable.combineLatest(o1, o2)的{​​{1}}变体(此形式受8个参数限制)

假设从combineLatest返回的类型看起来像:

case getPopByCity(city: String)

您可能想要实现这样的请求:

struct PopByCity: Decodable {
  let count: Float
}

但是如果您仍然需要一系列请求:

Observable.combineLatest(o1, o2)
  .map { (resp1: Response, resp2: Response) -> [PopByCity] in
    let pop1 = try? JSONDecoder().decode(PopByCity.self, from: resp1.data)
    let pop2 = try? JSONDecoder().decode(PopByCity.self, from: resp2.data)
    return [pop1, pop2].compactMap { $0 }
  }
  .subscribe(onNext: { (result: [PopByCity]) in
    print(result)
  })
  .disposed(by: disposeBag)

对于第二个选项,请记住,同时发送大量异步请求不是一个好习惯。对于许多需要执行的请求,建议您使用Concat运算符或Concat + Reduce的组合,如果您必须在上次响应之后的一个地方处理所有响应。

答案 1 :(得分:0)

我对Apple XCTest的误解。我需要添加:

                expectation.fulfill()

在我的订阅中。

Observable.combineLatest([o1, o2])
        .map { (responses: [Response]) -> [Weather] in
            responses.map { try? JSONDecoder().decode(Weather.self, from: $0.data) }
                .compactMap { $0 }
        }
        .debug()
        .subscribe(onNext: { (result: [Weather]) in
            print(result)
            expectation.fulfill()

        })
        .disposed(by: disposeBag)