背景
普段、あの通信してこの通信して、という感じでたくさんある通信をスレッド分けて並行処理することばかり意識しているんですが、いざ直列処理したい時にパッと出てこなかったのでメモ。
やりたかったこと
通信処理Aを行い、返り値を通信処理Bで使用した直列処理を行いたい。
(Aの完了を待機、かつ返り値を後続で利用したい)
想定
-
func fetchA() -> Dataを使用 -
fetchA()の戻り値を使用してfetchB(data: Data) -> Single<String>をしたい
コード
let process: Single<String> = fetchA()
.flatMap { fetchedData in
foo()
bar()
return fetchB(data fetchedData)
.flatMapを使用する。
そもそも、.map .flatMapの挙動を理解する必要がある。
RxSwift、そしてこの場合let processの型はSingle<String>。
.flatMapは戻り値がSingle(Observableとか)なので組み合わせに注意しないといけない。
例その2:
let process: Single<String> = fetchA()
.flatMap { fetchedData in
foo()
bar()
return fetchC(data fetchedData)
.flatMap { fetchedData2 in
// fetchedData2 を加工
let data = ...
return Single<String>.just(data)
}
}
まとめ
- 通信完了を待ち返り値を次の通信処理に流したい場合は
.flatMap - ストリームなので、最終的に返してる値が定義しているものと同じかチェック
- Observableなどに包まれている値を操作する場合、
.map系などでObservableを剥いで上げないといけない
上から下にストリームとして流れていくReactiveExtensionの概念ではこれめっちゃ大事説。