1

3 つの別々の API リクエストを使用して、3 種類のデータ ( ATypeBType、 ) をフェッチする必要があります。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)
}

ロジックをどのように書き直す必要がありますか?

4

1 に答える 1