2016-12-06 67 views
0

我的方法有些疑问。我有两个类型观测值:rxswift:如何获得Observable <Any>导致Observable <[Category]>的组合?

//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> 

我想这样做可观察到其第一获取所有的房屋,然后获取家庭。我所做的是类似的东西:

//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) 
} 

但这似乎对......不为反应风格我,这似乎是一个黑客,因为我不知道有足够的了解RX运营商。

你有没有在rxworld中做到这一点的正确方法?

谢谢

+0

我认为,你的任务有一个更优雅的解决方案。你可以在Github上分享你的任务代码吗?我想帮你。 – Svyatoslav

回答

3

要获得从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>

我们现在有一个可观察的,将发出一个未来事件和其家庭的细节每间房子。

如果我们宁愿保持House值周围,我们可以简单地再次在第一线图,就像这样:

let details: [Observable<(House, Family)>] = house.map { house in 
    houseDetail(house.id).map { (house, $0) } 
} 
相关问题