3 つの別々の API リクエストを使用して、3 種類のデータ ( AType、BType、 ) をフェッチする必要があります。CTypeAPI によって返されるオブジェクトは、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)
}
ロジックをどのように書き直す必要がありますか?