3 つの別々の API リクエストを使用して、3 種類のデータ ( AType
、BType
、 ) をフェッチする必要があります。CType
API によって返されるオブジェクトは、1 対多で関連付けられています。
- 1 つ
AType
のオブジェクトが N 個のBType
オブジェクトの親である - 1 つ
BType
のオブジェクトは P オブジェクトの親CType
です)
次の 3 つの関数を使用して、各型を取得しています。
func get_A_objects() -> Observable<AType> { /* code here */ }
func get_B_objects(a_parentid:Int) -> Observable<BType> { /* code here */}
func get_C_objects(b_parentid:Int) -> Observable<CType> { /* code here */}
ネストされたサブスクリプションを避けるために、これら 3 つの関数は次のように連鎖されていflatMap
ます。
func getAll() -> Observable<CType> {
return self.get_A_objects()
.flatMap { (aa:AType) in return get_B_objects(aa.id) }
.flatMap { (bb:BType) in return get_C_objects(bb.id) }
}
func setup() {
self.getAll().subscribeNext { _ in
print ("One more item fetched")
}
}
の M 個のオブジェクトがある場合、上記のコードは正常に動作AType
し、テキスト"One more item fetched"
が MxNxP 回出力されるのを見ることができました。
を使用してチェーン全体にgetAll()
ステータスの更新を配信する機能をセットアップしたいと思います。私の最初の考えは、次のようなものを書くことです:ReplaySubject<String>
func getAll() -> ReplaySubject<String> {
let msg = ReplaySubject<String>.createUnbounded()
self.get_A_objects().doOnNext { aobj in msg.onNext ("Fetching A \(aobj)") }
.flatMap { (aa:AType) in
return get_B_objects(aa.id).doOnNext { bobj in msg.onNext ("Fetching B \(bobj)") }
}
.flatMap { (bb:BType) in
return get_C_objects(bb.id).doOnNext { cobj in msg.onNext ("Fetching C \(cobj)") }
}
return msg
}
しかし、この試みは失敗しました。つまり、以下print()
は何も出力しません。
getAll().subscribeNext {
print ($0)
}
ロジックをどのように書き直す必要がありますか?