我是 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
但这行不通,我很困惑如何将一个产品代码列表转换为一系列产品详细信息
最佳答案
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
采用 swift 数组并将其转换为可观察对象。它将为数组的每个元素发出下一个事件。所以我们现在有Observable<Product>
在productsObservable
.调用
flatMap
在productObservable
将创建一个Observable<ProductDetail>
对于它发送的每个下一个事件。我们现在有一个 Observable,它将发送与listProducts
结果中的产品一样多的下一个事件。 .- 我们使用
toArray
将这个 observable 转换为只会发出 一个 下一个事件的东西,一个聚合来自productDetails
的所有结果的数组.
关于swift - 如何从另一个可观察数组中获取详细数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40414719/