RxSwift のクラスの整理


RxSwift は便利だがいっぱいクラスがあって圧倒されてしまう。 (たぶん RxJava/RxRelay など他の言語でも共通の話だと思います)

  • PublishSubject
  • BehaviorSubject
  • ReplaySubject
  • AsyncSubject
  • PublishRelay
  • BehaviorRelay
  • ReplayRelay
  • AsyncRelay

これらは すべて Observable の特殊系である。そして、[Publish|Behavior|Replay|Async]と[Subject|Relay]の組み合わせである。

Observable

前置き。

Observable は以下のような特徴をもつ。

  1. 値が emit されるたびに onNext が呼ばれる
  2. 自身の onNext, onCompleted, onError を自分で呼び出すことはできない
  3. 終了時、エラー時に onCompleted, onError が呼ばれる

この特徴の 2 を開放したものが Subject 、 3を制限したものが Relay とみなすことができる。

前置きここまで。各要素について説明していく。

Subject

  • ほぼ Observable
  • + Hot/Shared
  • + 自身の onNext, onCompleted, onError を自分で呼び出して発生する機能開放がされている
    • ””自分で"" 送れる=主語=Subject 的な由来…?

Relay

  • ほぼ Observable
  • + Hot/Shared
  • + Completed, Error を送出する機能がもぎ取られている
    • 値を送るだけ=リレー的な由来…?

Publish

  • 購読したら購読したタイミングからの値が流れてくる
  • (これがまあ当然っぽく感じる一番素朴なやつ)

Behavior

  • ほぼPublish
  • +購読したらとりあえず最新の値が流れてきて、その後もemitされた値が流れてくる

Replay

  • ほぼBehavior
  • +最新の値1個だけでなく、n個とりあえず流すことができる

Async

  • onCompletedのときに、購読した側は「一番最後値→onCompleted」になる(説明が難しい 珍しくマーブルダイアグラムを見たほうがわかりやすいと思った例)
  • Relay 版はない(onCompletedをもぎ取られてるから)

まとめ

[Publish|Behavior|Replay|Async]+[Subject|Relay]は、すべてObservableであるが、若干違う部分があり、それぞれの要素の特徴の組み合わせで説明できる。

PublishSubject

  • Hot/Shared な Observable である
  • + 自身の onNext, onCompleted, onError を自分で呼び出して発生する機能開放がされている (Subject)
  • 購読したら購読したタイミングからの値がふつうに流れてくる (Publish)

BehaviorSubject

  • Hot/Shared な Observable である
  • + 自身の onNext, onCompleted, onError を自分で呼び出して発生する機能開放がされている (Subject)
  • + 購読したらとりあえず最新の値が1個流れてきて、その後もemitされた値が流れてくる (Behavior)

ReplaySubject

  • Hot/Shared な Observable である
  • + 自身の onNext, onCompleted, onError を自分で呼び出して発生する機能開放がされている (Subject)
  • + 購読したらとりあえず最新の値がn個流れてきて、その後もemitされた値が流れてくる (Replay)

AsyncSubject

  • Hot/Shared な Observable である
  • + 自身の onNext, onCompleted, onError を自分で呼び出して発生する機能開放がされている (Subject)
  • + 購読しても値は流れてこず、onCompletedがemitされたときに一番最後の値だけが流れてくる (Async)

PublishRelay

  • Hot/Shared な Observable である
  • + Completed, Error を送出する機能がもぎ取られている (Relay)
  • 購読したら購読したタイミングからの値がふつうに流れてくる (Publish)

BehaviorRelay

  • Hot/Shared な Observable である
  • + Completed, Error を送出する機能がもぎ取られている (Relay)
  • + 購読したらとりあえず最新の値が1個流れてきて、その後もemitされた値が流れてくる (Behavior)

ReplayRelay

  • Hot/Shared な Observable である
  • + Completed, Error を送出する機能がもぎ取られている (Relay)
  • + 購読したらとりあえず最新の値がn個流れてきて、その後もemitされた値が流れてくる (Replay)

AsyncRelay

  • そんなものはない
  • Async は onCompleted のときにごにょごにょするという意味だが、Relay からはそもそもCompletedを送出する機能がもぎ取られているので