30
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-16

はじめに

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

30
19
0

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
30
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?