RxSwift学びの過程〜直列処理編〜
背景
普段、あの通信してこの通信して、という感じでたくさんある通信をスレッド分けて並行処理することばかり意識しているんですが、いざ直列処理したい時にパッと出てこなかったのでメモ。
やりたかったこと
通信処理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)
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を剥いで上げないといけない
.flatMap
.map
系などでObservableを剥いで上げないといけない上から下にストリームとして流れていくReactiveExtension
の概念ではこれめっちゃ大事説。
Author And Source
この問題について(RxSwift学びの過程〜直列処理編〜), 我々は、より多くの情報をここで見つけました https://qiita.com/sho_v00/items/e1bd4855707faae66a4e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .