きょうは英会話でめちゃくちゃ怖い先生にあたって凹んでいるので、 Tour of Go を読むのは一旦お休み。

※途中でElementと”値”という言葉が混在してるけど同じ意味。

RxのSubjectについて

SubjectはObserverでもありObservableでもある。つまりElementを流すこともできるしsubscribeすることもできる。

そしてSubjectは、

  • PublishSubject
  • ReplaySubject
  • BehaviorSubject

の3つ存在する。

PublishSubject

PublishSubjectsubscribe後のElementだけを流す。BehaviorSubjectとの違いは過去の値が流れてこないこと。

subscribeしたあとだけElementが流れてくる。

BehaviorSubject

subscribeされたタイミングで最新の値を流す。BehaviorSubjectを初期化する際は初期値を設定するようになっていて、 何もElementが流れていない場合は初期値を流すようになっている。

つまりsubscribeしたタイミングで何らかの値(初期値 or 過去の最新の値)が流れるようになっている。

let behaviorSubject = BehaviorSubject<Int>(value: 1)

ReplaySubject

subscribe後に値を流す。bufferSizeを指定するようになっていて、bufferSizeに指定した数だけElementだけを流す。

let replaySubject = ReplaySubject<Int>.create(bufferSize: 1)

指定したサイズの数だけElementをbufferしといて、subscribeされたらそれを流す感じ。

BehaviorSubjectbufferSize1に設定したもの。

Variable

BehaviorSubjectをラップしているVariableというものもあって、プロパティのようにget/setで値が流れるようになる。

class Some {
    let variable = Variable<Int>(1)
}

明日はshare()shareReplay(n)の違いについて掘り下げてみるつもり。