【RxSwift】用語まとめました

:::note info
RxSwiftに関する用語を箇条書きでまとめてみました
:::

<!-- ------------------------------------------------------ -->
## 基本用語
__<font color="blue">Observerパターン：</font>__
以下のように「何かの動きに合わせて、別な何かを動かしたい」のような要件に使われるもの。
・データに変更が発生→画面表示を更新
・ユーザーが検索条件欄に何かを入力→候補リストの内容を絞り込み
・非同期による通信処理が終了→その完了と結果をユーザーにダイアログ表示で伝達

__<font color="blue">Subject：</font>__ 監視される側（以降「される側」と表記）

__<font color="blue">Observer：</font>__ 監視する側（以降「する側」と表記）

__<font color="blue">Publish/Subscribeモデル：</font>__ Observerパターンの別名

__<font color="blue">Subject(される側)に必要なもの：</font>__ 
・Observer(する側)を保持するための変数
・Observer(する側)の追加や削除を行うメソッド
・何か動きがあった時に、それを保持するすべてのObserver(する側)に知らせるメソッド

__<font color="blue">Observer(する側)に必要なもの：</font>__ 
・Subject(される側)に変更を通知してもらうためのPublicメソッド
・変更の通知を受けた時の処理

__<font color="blue">Observable：</font>__ 処理を記述する起点。Observer(する側)が観測できるもの。

__<font color="blue">HotなObservable：</font>__ subscribeする前から動いて（発行が始まって）おり、Observer(する側)は途中からそれに参加して発行を受けるようなObservableのこと。

__<font color="blue">Cold なObservable：</font>__ subscribeされるまでは何の発行も行われないObservableのこと。

<!-- ------------------------------------------------------ -->
## Operator関係

__<font color="blue">just：</font>__ Observableのインスタンスを生成するOperator。1つの要素だけを渡す。

__<font color="blue">of：</font>__ Observableのインスタンスを生成するOperator。複数の要素を渡す。

__<font color="blue">from：</font>__ Observableのインスタンスを生成するOperator。引数として配列を受けるようになっており、ここで渡した配列の各要素がSubjectの起こした動きとして、1つずつ順番にObserverに発行されていく。

__<font color="blue">map：</font>__ 流れてくる各要素の加工が行えるOperator。

__<font color="blue">flatMap：</font>__ 上流のObservableの流れを汲んで新たなObservableに流れを置き換えるOperator。mapはObservableの流れはそのままに、要素の中身・型だけを変換していたのに対し、flatMapはObservableごと変換する。

__<font color="blue">subscribe：</font>__ Operatorの一つ。subscribeを呼び出すことでfromやmap等で記述した処理が動き出し、Observerに各要素が渡されていく。

__<font color="blue">Deferred：</font>__ ObserverがsubscribeしたタイミングでObservableの生成を行い、かつObserverごとにObservableを生成するOperator。

__<font color="blue">Timer：</font>__ 指定した時間が経過した時に要素を発行するObservableを生成するOperator。

__<font color="blue">Interval：</font>__ 指定した時間毎に要素を発行するObservableを生成するOperator。

__<font color="blue">TakeUntil：</font>__ 引数として渡したObservableが何かしらの要素を発行した時に、自身の発行を完了させる（onCompletedを起こす）Operator。

__<font color="blue">filter：</font>__ 条件による要素の絞り込むOperator。

__<font color="blue">take：</font>__ 要素を先頭から指定した数だけ取得するOperator。

__<font color="blue">buffer：</font>__ 指定した時間が経つまで、あるいは指定した数だけ発行されるまで、要素を溜め込むOperator。

__<font color="blue">distinctUntilChanged：</font>__ 同じ要素の連続を省くOperator。

__<font color="blue">merge：</font>__ 複数のObservableを1つにまとめるOperator。

__<font color="blue">combineLatest：</font>__ mergeの機能に加えて、Observableでも発行を起こした時に、すべてのObservableの最後に発行された要素をそれぞれ持ち寄って、それらを1つの要素に合体させたものを下流へと流すというOperator。

__<font color="blue">withLatestFrom：</font>__ Operatorの1つ。combineLatestは、どのObservableが発行してもObserverに通知が行くのに対して、withLatestFromはその主体となるObservableが決まっている。

<!-- ------------------------------------------------------ -->
## Connectable関係

__<font color="blue">Connectable Observable：</font>__ Observableに要素の発行に関するより高度な振る舞いを加えるための仕組み。例えば、ColdなObservableでもObserverがsubscribeした時点では発行は行われず、connectメソッドを呼ぶと購読しているすべてのObserverに対して一斉に発行が開始されるようになる、など。

__<font color="blue">publish：</font>__ ObservableをConnectable Observableに変換する標準的な方法。

__<font color="blue">multicast：</font>__ multicastは自前で用意したSubjectを渡して、それ経由で一斉発行を行う。

<!-- ------------------------------------------------------ -->
## subscribeのイベント

__<font color="blue">onNext：</font>__ subscribeする際に使う。Observableから1つの要素が発行され、Observerに渡される時のイベント。

__<font color="blue">onCompleted：</font>__ subscribeする際に使う。すべての要素を渡し終えて処理が完了した時のイベント。

__<font color="blue">onError：</font>__ subscribeする際に使う。中で何かしらのエラーが発生した場合のイベント。

__<font color="blue">onDisposed：</font>__ subscribeする際に使うリソース解放のためのメソッド。subscribeによって動作している処理をキャンセルし、Observableが内部で保持しているObserverを解放する。

<!-- ------------------------------------------------------ -->
## Subject関係

__<font color="blue">PublishSubject：</font>__ Subjectの1つ。onNextメソッドを使うことで、購読しているObserverたちに要素を発行することができる。

```swift
    // 書き方例
    let testSubject = PublishSubject<String>()
```

__<font color="blue">BehaviorSubject：</font>__ Subjectの1つ。PublishSubjectの挙動に加え、Observerが新規に加わった時、一番最後に発行された要素をそのObserverに対して発行する挙動を取る。BehaviorSubjectは最低1つは発行済みの要素を持っていないといけないため、インスタンス生成時に1つの要素を引数として渡す必要がある。

```swift
    // 書き方例
    let testSubject = BehaviorSubject<String>(value: "hoge")
```

__<font color="blue">ReplaySubject：</font>__ Subjectの1つ。PublishSubjectの挙動に加え、Observer(する側)が新規に加わった時、最後からbufferSize（インスタンス生成時の引数）で指定された数までの要素をそのObserver(する側)に対して発行する挙動を取る。

```swift
    // 書き方例
    let testSubject = ReplaySubject<String>.create(bufferSize: 3)
```

__<font color="blue">AsyncSubject：</font>__ Subjectの1つ。最後にonNextで発行された要素を、onCompletedが呼ばれた後に1つだけ発行する挙動を取る。（ちなみに、他のSubjectはonNextと同時に要素がObserverへ届けられ、onCompletedが呼ばれた後では、いくらonNextを呼んでもそれ以降の発行はされない。逆にonCompletedが呼ばれなければ一切の発行はされない。）

```swift
    // 書き方例
    let testSubject = AsyncSubject<String>()
```
__<font color="blue">DisposeBag：</font>__ DisposeBagのインスタンスを作成しておき、subscribeの後のdisposed(by:)メソッドでそれを渡しておけば、DisposeBagのインスタンスが破棄されるタイミングで一緒にそのObserverも破棄することができる。(subscribeをした後、すぐdispose()を呼んでしまうと、そこでそのObserverは破棄されてしまう)

```swift
    // 書き方例
    let disposeBag = DisposeBag()
                .
                .
                .
    .disposed(by: disposeBag)
```

<!-- ------------------------------------------------------ -->
## Create関係

__<font color="blue">Create：</font>__ 要素の発行を自前で行うマニュアルなObservableを作成するためのOperator。

__<font color="blue">Disposable：</font>__ ObservableやObserverにdisposeの挙動を付加するためのプロトコル。

__<font color="blue">Cancelable：</font>__ Observableにdisposeしたかどうかの判定の挙動を付加するためのプロトコル。

<!-- ------------------------------------------------------ -->
## Scheduler関係

__<font color="blue">Scheduler：</font>__ メインスレッドで動作する直列キューのScheduler。通常は自分でインスタンスを作らず、SingletonインスタンスであるinstanceプロパティまたはasyncInstanceプロパティを使用する。

__<font color="blue">ConcurrentMainScheduler：</font>__ メインスレッドで動作するScheduler。Concurrentと名前に付いているが、メインキューでメインスレッドなので並行には処理されない。

__<font color="blue">SerialDispatchQueueScheduler：</font>__ 直列キューのScheduler。メインスレッドかサブスレッドかは、インスタンス生成時に渡すキューによって変わる。

__<font color="blue">ConcurrentDispatchQueueScheduler：</font>__ 並行キューのScheduler。メインスレッドかサブスレッドかは、インスタンス生成時に渡すキューによって変わる。

__<font color="blue">subscribeOn：</font>__ subscribeを呼んでから後の処理のSchedulerを決定するためのOperator。subscribeOnでメインスレッドを指定したい場合は、このOperatorに最適化されたConcurrentMainSchedulerを使用する必要がある。

__<font color="blue">observeOn：</font>__ 宣言的に書いた一連の処理において、observeOnを書いた以降の処理のSchedulerを決定するためのOperator。observeOnでメインスレッドを指定したい場合はこのOperatorに最適化されたMainSchedulerを使用する必要がある。