[iOS, RxSwift] RxSwift, Observables

Combineが出てるのにRxSwiftだなんて今更感あるけど
Rxの理解ができていないと今後Combineを導入する時も結構大変そうと思ったので主な概念を忘れないよう自分用の備忘録として書いておきます。

1. RxSwift

Rxは元々Webアプリケーションの非同期処理のため作られたライブラリです。これのSwift版がRxSwiftです。
モバイルアプリケーション内での複雑な非同期処理を行うために開発の際RxSwiftを使います。

RxSwiftでは、
- Observables
- Operators
- Schedulers

この3つのことが大事です。

2. Observables

- Rxで一番の基礎であるObservableクラス(シークエンスとも言われます)は不変のデータTを保存し、非同期的に渡すイベントの役割を担当するクラスです。Subscribe(購読)をすると、他のクラスにデータ(値)を渡すことができます。

- Observableクラス一つ、またはいくつかのObserver(監視者)がリアルタイムで発生するイベントとUIの更新に反応します。また、新しいデータと流れてくるデータを処理かつ活用します。

- ObservableTypeのプロトコルは3つのイベントタイプのみプッシュすることができます。

・next:最新(または次)の値を流してObserverは値を受け取ります。
・completed:イベントシークエンス(Observable)が成功し、完了された時点で発火します。その以外の場合には発火しません。
・error:エラーが起きたり、値をプッシュできなかった場合に発火されます。

2-1. 有限Observable

「成功→終了」または「エラー→終了」
こういったライフサイクルの持つObservableを有限Observableと言います。

iOSアプリからインターネットを通じてあるファイルをダウンロードするとしましょう。

1.流れてくるデータのダウンロードし、監視する
2.その後流れてくるファイルのデータを繰り返して受け取る
→ネットが切れたらダウンロードは終了しエラーと共にタイムアウトが発生
or
→ファイル内のすべてのデータダウンロードが完了されたら成功終了になる

この流れをコードで表すと下記のようになります。

API.download(file: "http://www...")
 .subscribe(onNext: { data in
   ... append data to temporary file
 },
 onError: { error in
   ... display error to user
 },
 onCompleted: {
   ... use downloaded file
 })

2-2. 無限Observable

ファイルのダウンロードみたいに有限な流れを持つObservableとは異なる無限ループのような流れを持つObservableもあります。これを無限Observableと言います。

例に、アプリのデバイス向きに反応する場合を見てみましょう。

1. NotificationCenterを通してUIDeviceOrientationDidChangeというNotificationを監視するクラスを作る
2. デバイスの向きを監視し、方向が変わるイベントにすぐに反応するメソッドを作る

方向に変化がなくてイベントが発生しないことはあるけど、Observerはずっとイベントを監視しているのでこのシークエンスはずっとこの流れを繰り返します。

この流れをコードで表すと下記のようになります。

UIDevice.rx.orientation
 .subscribe(onNext: { current in
switch current {
case .landscape:
       ... re-arrange UI for landscape
case .portrait:
       ... re-arrange UI for portrait
   }
 })

3. 最後に

UIイベントでは無限Observableがよく使われるので、この概念を知っておくとアプリ開発で役に立つと思います。

OperatorsとSchedulersは引き続き別の記事で!

この記事が気に入ったらサポートをしてみませんか?