如何从另一个可观察的数组中获取详细数组

时间:2016-11-04 03:14:59

标签: swift rx-swift

我是RxSwift的初学者,一般尝试用我的REST API链接两个不同的操作来获取所有详细的产品。

我包装了一些REST API来返回RxSwift Observable,一个返回产品列表和其他产品细节。

class API {
    func listProduct() -> Observable<[Product]> { ... }
    func detailProdcut(code: Int) -> Observable<[ProductDetail]> { ... }
}

现在我想从产品列表中获取产品详细信息,如何以Rx方式执行此操作?我正在尝试做类似

的事情
API.init().listProduct()
    .flapMap { products -> <Product> in return products[0] }
    .map { product in API.init(product.code) }
    .merge()
    .toArray

但是不起作用,我对如何将一个产品代码列表转换为一系列产品细节感到困惑

1 个答案:

答案 0 :(得分:6)

let api = API()

let productDetails = api.listProducts()
  .flatMap { products in
    let productsObservable = Observable.from(products)
    let productDetails = productsObservable.flatMap { api.detail(product($0.code) }

    return productDetails.toArray()
  }

这里发生了什么:

  • flatMap有专门的类型[Product] -> Observable<[ProductDetails]>。怎么样?请继续阅读。

  • Observable.from采用快速数组并将其转换为可观察的数组。它将为数组的每个元素发出下一个事件。我们现在Observable<Product>中有productsObservable

  • flatMapproductObservable的来电将为其发送的每个下一个事件创建Observable<ProductDetail>。我们现在有一个可观察的会在listProducts的结果中发送与其产品一样多的下一个事件。

  • 我们使用toArray将此观察值转换为仅发出一个下一个事件的内容,这是一个聚合来自productDetails的所有结果的数组。