rxswift:如何获取 Observable<Any> 导致 Observable<[Category]> 的组合?
Posted
技术标签:
【中文标题】rxswift:如何获取 Observable<Any> 导致 Observable<[Category]> 的组合?【英文标题】:rxswift: how to get the Observable<Any> resulting in a combination of Observable<[Category]>? 【发布时间】:2016-12-06 14:45:32 【问题描述】:我对自己的方法有些怀疑。我有两种类型的 Observable:
//I can fetch from the server the houses and save them in the database
func houses() -> Observable<[House]>
//Given a houseId, I can fetch it's details and save them in the database
func houseDetail(id: Int) -> Observable<Family>
我想做一个 Observable,它首先获取所有房屋,然后获取家庭。我所做的是这样的:
//I am an observable which, when I complete, all data are saved
func fetchAllHousesAndFamily() -> Observable<Any>
var allHousesObservables: [Observable] = []
for house in houses
allHousesObservables.append(houseDetail(house.id))
return Observable.combineLatest(allHousesObservables)
但这对于...对我来说似乎不是响应式风格,而且这似乎是一种 hack,因为我对 rx 运算符了解不够。
在 rxworld 中你有正确的方法吗?
谢谢
【问题讨论】:
我认为你的任务有一个更优雅的解决方案。您可以在 Github 上与您的任务共享示例代码吗?我想帮你。 【参考方案1】:要从houses
的结果中获取所有家庭,您需要使用flatMap
运算符。 flatMap
接受带有签名 T -> Observable<U>
的闭包,因此,在我们的具体示例中,它将是 [House] -> Observable<Family>
类型的函数。
houses().flatMap houses in
let details: [Observable<Family>] = houses.map houseDetail($0.id) // [1]
return Observable.from(details).merge() // [2]
[1]:我们将房屋数组映射到Observable<Family>
数组。
[2]:from(_:)
将[Observable<Family>]
转换为Observable<Observable<Family>>
。 merge()
然后将其转换为 Observable<Family>
我们现在有一个 observable,它会为每个房子发出一个 next 事件及其家庭详细信息。
如果我们希望保留 House
值,我们可以简单地在第一行再次映射,如下所示:
let details: [Observable<(House, Family)>] = house.map house in
houseDetail(house.id).map (house, $0)
【讨论】:
以上是关于rxswift:如何获取 Observable<Any> 导致 Observable<[Category]> 的组合?的主要内容,如果未能解决你的问题,请参考以下文章
RxSwift,依赖链的下载返回相同的 Observable 类型
RxSwift + UITableViewCell 如何在 heightForRowAt 中获取单元格对象
RxSwift 从 Observable 序列中的一项获取值
如何检查 RXSwift 中的 observable 是不是为空?