2016-12-06 6 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> 

:私は、観測の2種類があります。私がやったようなものです:

//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でそれを行う正しい方法がありますか?

housesの結果から、すべての家族を取得するには、あなたに

+0

私はあなたのタスクは、よりエレガントな解決策を持っていると思います。 Githubであなたのタスクとサンプルコードを共有できますか?私はあなたを助けたいです。 – Svyatoslav

答えて

3

をありがとう、あなたは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()はその後、私たちは今、その家族の詳細と、各家のための1次のイベントを放出する、観察を持ってObservable<Family>

にそれを変換します。

私たちは周りHouse値を維持することを好むだろうならば、我々は単純にそうように、最初の行に再びマッピングすることができます:

let details: [Observable<(House, Family)>] = house.map { house in 
    houseDetail(house.id).map { (house, $0) } 
} 
関連する問題