rxswift:如何获得 Observable<Any> 导致 Observable<[Category]> 的组合?

rxswift: how to get the Observable<Any> resulting in a combination of Observable<[Category]>?

我对自己的做法有些怀疑。我有两种类型的 Observables:

//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有正确的方法吗?

谢谢

要从 houses 的结果中获取所有族,您需要使用 flatMap 运算符。 flatMap 接受带有签名 T -> Observable<U> 的闭包,因此,在我们的特定示例中,它将是类型 [House] -> Observable<Family>.

的函数
houses().flatMap { houses in
  let details: [Observable<Family>] = houses.map { houseDetail([=10=].id) } // [1]

  return Observable.from(details).merge() // [2]
}
  • [1]:我们正在将 house 数组映射到 Observable<Family> 数组。
  • [2]: from(_:) converts [Observable<Family>] to Observable<Observable<Family>>. merge() 然后转换为 Observable<Family>

我们现在有一个 Observable,它将为每个房子发出下一个事件及其家庭详细信息。

如果我们希望保留 House 值,我们可以简单地在第一行再次映射,如下所示:

let details: [Observable<(House, Family)>] = house.map { house in 
  houseDetail(house.id).map { (house, [=11=]) }
}