LoginSignup
1

More than 3 years have passed since last update.

RxSwift のクラスの整理

Last updated at Posted at 2019-12-12

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を送出する機能がもぎ取られているので

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1