はじめに
「比較して学ぶRxSwift」を読んで、SubjectやRelayについての理解が深まったので、整理しました。
Subject・Relayとは
Observableはイベントを検知するためのクラスですが、
一方SubjectとRelayはイベントの検知も、イベントの発生もできるクラスです。
流せるイベント | バッファ | |
---|---|---|
PublishSubject | onNext, onError, onComplete | 持たない |
BehaviorSubject | onNext, onError, onComplete | 持つ |
PublishRelay | onNext | 持たない |
BehaviorRelay | onNext | 持つ |
※ Subjectは3種類のイベントを流すことができ、RelayはonNextのみ。
※ Publishはバッファを持たず、Behaviorはバッファを持つ。
バッファとは
BehaviorSubject/Relayは、subscribe時に1つ過去のイベントを受け取ることができる。
最初にsubcribeするときは、宣言時に設定した初期値を受け取る。
用途
-
Subject
- エラーによって処理を分けたいとき(通信処理やDB処理などでメッセージを出したい)
-
Relay
- UIに値をバインドする(イベントを拾えない状態にならないようonNextのみを保証したい)
RelayでのonNextイベント
Relayで、onNextのイベントを流すには、acceptのメソッドを使用する。
内部的にはSubjectのラッパーとなっており、onNextを呼んでいる。
RxSwift/PublishRelay
public final class PublishRelay<Element>: ObservableType {
private let _subject: PublishSubject<Element>
// Accepts `event` and emits it to subscribers
public func accept(_ event: Element) {
self._subject.onNext(event)
}
...
}