RxSwiftメモ

# はじめに
RxSwiftにおける用語やクラスの概要をメモしました。

# 用語メモ

- Observerパターン：デザインパターンの一つで、あるオブジェクトで発生したイベントを別のオブジェクトへ通知するモデル（＝ オブジェクトを監視してイベントが発生した場合にそれをオブザーバーへ通知するモデル）。
- RxSwiftにおけるイベント：画面上で発生するタップイベント、変数の値の変化、APIからの値の取得など**オブジェクトの状態変化全て。**
- データストリーム：RxSwiftでイベントストリームの中で流れてくるデータの部分
- Observableクラス: 監視可能なものを表し、データストリームを表現するクラス。onNext, OnError, OnCompletedの3種類を通知。実行者（出版）。
    - subscribe(_:): Observableクラスのイベントを受け取れるメソッド。戻り値はDisposableオブジェクト。
        - Disposableオブジェクト：Observableオブジェクトを利用する必要がなくなった際に、自動的にメモリを解放するオブジェクト。
        - disposed(by: ): Disposableオブジェクトを解放するメソッド。引数に、廃棄フラグ的な役割を果たすDisposeBagオブジェクトを渡す。DisposeBagオブジェクトは一度定義すれば、使い回しが可能。
    - Observableオブジェクトを生成する主なクラスメソッド
        - of: 一定数の要素でObservableを作成
        - from: 配列/辞書/集合などからObservableを作成
        - create: Observableをゼロから作成
        - never: イベントを終了しないObservableを作成
        - empty: completedイベントのみを発生するObservableを作成
- rxプロパティ：各UIのObservableオブジェクトを返す。開発者自身がUI単位でObservableオブジェクトを生成する必要ない。rxプロパティで各UIのイベントを監視可能。
    - UIのdelegateの代わりにRxで処理が可能
    - データバインドが利用可能（データバインド：画面上のオブジェクトとRxで監視可能なオブジェクトを結合すること）。bindTo(_:)メソッドを利用。
- RxSwiftのオペレーター：RxSwiftにおいて、配列の要素を操作（＝データストリームを制御）するメソッド。イメージとしては、データストリームから得られる値をどう扱うか。
    - オペレータは複数繋いで処理が可能（メソッドチェーン）
    - 主なオペレータ
        - map: データストリームを別のデータストリームに変換
        - filter: 条件に合わないデータストリームを削除
        - merge: 複数のデータストリームを統合。
        - flatMap: 前のデータストリームを維持して次のデータストリームを処理。
        - flatMapLatest: 前のデータストリームをキャンセルして次のデータストリームを処理
        - zip: 複数のデータストリームが存在する場合に全ての処理が終わるまで待って統合
        - withLatestFrom: ある Observable にもう一方の Observabe の最新値を合成
        - debunce：指定期間新たらイベントが発行されなくなてから、最後に発行されたイベントを発行
            - 用途：サーバー負荷を考慮して、インクリメンタルサーチでAPIを叩きすぎないようにする時など
            
            ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/6f2a4d82-73c8-c953-fe32-68d37d95c9e3.png)
            
        - throttle:
            - 引数 latest が true の場合 (default)：計測が開始された最初のイベントと、**指定期間内で最後に発行されたイベント（最初のイベント以外）を発行**。途中のイベントは無視。
                - 用途：ボタン連打防止など？
            
            ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/939d2f0b-7db1-b233-8d9c-dfa7efcfdbf5.png)
            
            - 引数 latest が false の場合：計測が開始された最初のイベントを発行し、**指定期間内のイベントは全て無視**。
            
            ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/3fa7b35f-0905-8a7c-f8d3-3e398063fb8d.png)

            
- Driverクラス: UI関連で用いられるObservable的に定義されたクラス。例えば、UISearchBarやUITableViewなどのUIでは、onErrorのイベントが通知されてもUIを止めるわけにいかないので、onErrorイベントを通知する必要がない。
    - 特徴：
        - OnErrorを通知しない：途中でUIが動かなくなるなどの不具合を回避可能
        - イベントの通知をメインスレッドで行う：結果をすぐにUIに反映可能
    - 利用方法
        1. 通常のObservableオブジェクトをasDrive()メソッドでDriverオブジェクトに変更
        2. drive(*:)メソッドを利用*（Observableにおけるsubscribe(_:)）
- Subject・Relay：イベントの発生と受信の両方ができるクラス（ObservableとObserverの両方で機能）
    - 用途
        - Subject: エラーによって処理を分けたい時（通信処理やDB処理などでメッセージを出したい）
            - 3種類（onNext, onError, onComplete）のイベントを通知可能
        - Relay: UIに値をバインドする（イベントを拾えない状態にならないようにonNextのみを保証したい）
            - onNextのみを通知可能
    
    |  | 流せるイベント | バッファ |
    | --- | --- | --- |
    | PublishSubject | onNext, onError, onComplete | 持たない |
    | BehaviorSubject | onNext, onError, onComplete | 持つ |
    | PublishRelay | onNext | 持たない |
    | BehaviorRelay | onNext | 持つ |
    
    Publishはバッファを持たず、Behaviorはバッファを持たない。
    
    （バッファ：subscribe時に1つ過去のイベントを受け取ることができる。最初にsubscribeする時は宣言時に設定した初期値を受け取る。BehaviorSubject/Relayがバッファを持つ。）
    
    - Variableクラス (**RxSwift4以降deperecated**): valueプロパティで値を指定できるSubject。valueプロパティで指定する値が変化した時にonNextイベントが発生。**BehaviorRelay**がVariableに取って代わった。

# 参考

- [https://codezine.jp/article/detail/11000](https://codezine.jp/article/detail/11000)
- [https://qiita.com/k5n/items/17f845a75cce6b737d1e#variable](https://qiita.com/k5n/items/17f845a75cce6b737d1e#variable)
- [https://qiita.com/dekatotoro/items/be22a241335382ecc16e](https://qiita.com/dekatotoro/items/be22a241335382ecc16e)
- [https://qiita.com/marty-suzuki/items/496f211e22cad1f8de19](https://qiita.com/marty-suzuki/items/496f211e22cad1f8de19)
- [https://medium.com/fantageek/throttle-vs-debounce-in-rxswift-86f8b303d5d4#:~:text=Throttle%3A the original function is,will see you next time](https://medium.com/fantageek/throttle-vs-debounce-in-rxswift-86f8b303d5d4#:~:text=Throttle%3A%20the%20original%20function%20is,will%20see%20you%20next%20time).