Help us understand the problem. What is going on with this article?

RxSwift のクラスの整理

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

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

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

Disclaimer: 独自解釈です。誤解を生みそうな表現等ありましたらコメントいただけるとありがたいです。

Observable

前置き。

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

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

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

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

Subject

  • ほぼ Observable
  • + Hot/Shared
  • + 自身の onNext, onCompleted, onError を自分で呼び出して発生する機能開放がされている

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を送出する機能がもぎ取られているので
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away