RxSwiftのSubjectとRelayについて理解する


はじめに

「比較して学ぶ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)
    }
   ...
}

参考

比較して学ぶRxSwift