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=]) }
}
我对自己的做法有些怀疑。我有两种类型的 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>]
toObservable<Observable<Family>>
.merge()
然后转换为Observable<Family>
我们现在有一个 Observable,它将为每个房子发出下一个事件及其家庭详细信息。
如果我们希望保留 House
值,我们可以简单地在第一行再次映射,如下所示:
let details: [Observable<(House, Family)>] = house.map { house in
houseDetail(house.id).map { (house, [=11=]) }
}