SignalとDriverの違い replayから読み解く
SignalとDriverについて
RxSwiftのSignalを調べてみると、
Signal
は、replay
を行わない。
Driver
は、 replay
を行う。
という解説を見かけました。
でも、replayってなんやろ?って思ったので、そこを踏まえて Signal
と Driver
の違いについて解説をしていきたいと思います。
sharedReplayを使うメリット
1つのObservableに対して2つの購読対象がある場合2本のストリームが用意され、値が2度流れてくることになります。そこで、shareReplayを使います。 最後にshareReplayを書くと、1つの値しか流れ無くなります。 shareReplay(1)は、内部的にreplay(1).refCountを行なっています。 では、次の章でreplayを見ていきます。
ConnectableObservableとObservableの違い
Observableは、subscribeした時点でObserver毎に計算リソースが割り当てられています。 replayは、ConnectableObservableの変換を行っています。 ->map内に複数の処理が走ることになる
ConnectableObservableはsubscribeしているObserverが複数いたとしても、全てのObserver間で共有の計算リソースが割り当てられ、同時に値を通知する.
ただし、replayだけでは何も流れずconnectをする必要がある。 RxSwiftのConnectを使用すると、disposeをConnectされる毎にする必要がある。
そこで、refCountを使用する。 refCountは、subscribeされる度に内部でsubscribeしているのものをカウントしている。 そして、disposeする度に内部のカウントをデクリメントしている。 内部カウンターの値が0になると、Connectしたソースをdisposeする。