RxSwift のクラスの整理
RxSwift は便利だがいっぱいクラスがあって圧倒されてしまう。 (たぶん RxJava/RxRelay など他の言語でも共通の話だと思います)
- PublishSubject
- BehaviorSubject
- ReplaySubject
- AsyncSubject
- PublishRelay
- BehaviorRelay
- ReplayRelay
- AsyncRelay
これらは すべて Observable の特殊系である。そして、[Publish
|Behavior
|Replay
|Async
]と[Subject
|Relay
]の組み合わせである。
Observable
前置き。
Observable は以下のような特徴をもつ。
- 値が emit されるたびに onNext が呼ばれる
- 自身の onNext, onCompleted, onError を自分で呼び出すことはできない
- 終了時、エラー時に 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を送出する機能がもぎ取られているので
Author And Source
この問題について(RxSwift のクラスの整理), 我々は、より多くの情報をここで見つけました https://qiita.com/kumamotone/items/7b1ae344ddbe76cb95a7著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .