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 -&gt; Observable&lt;U&gt; 的闭包,因此,在我们的具体示例中,它将是 [House] -&gt; Observable&lt;Family&gt; 类型的函数。

houses().flatMap  houses in
  let details: [Observable<Family>] = houses.map  houseDetail($0.id)  // [1]

  return Observable.from(details).merge() // [2]

[1]:我们将房屋数组映射到Observable&lt;Family&gt; 数组。 [2]:from(_:)[Observable&lt;Family&gt;] 转换为Observable&lt;Observable&lt;Family&gt;&gt;merge() 然后将其转换为 Observable&lt;Family&gt;

我们现在有一个 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 是不是为空?

如何在 Observable.create (RxSwift) 中返回/转发一个 observable

如何在 RxSwift 中取消订阅 Observable?