我是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
但是不起作用,我对如何将一个产品代码列表转换为一系列产品细节感到困惑
答案 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
。
flatMap
上productObservable
的来电将为其发送的每个下一个事件创建Observable<ProductDetail>
。我们现在有一个可观察的会在listProducts
的结果中发送与其产品一样多的下一个事件。
toArray
将此观察值转换为仅发出一个下一个事件的内容,这是一个聚合来自productDetails
的所有结果的数组。