LoginSignup
0
2

More than 3 years have passed since last update.

RxSwiftのSubjectとRelayについて簡単にまとめる

Posted at

はじめに

RxSwiftの勉強を始めてObservableについてある程度理解できたので、まとめとして残しておきます。

BehaviorSubject

BehaviorSubjectは初期値を設定することができ、onNext, onError, onCompleteの3つのイベントを流すことができます。

        //初期値に0を設定、Intが流れるストリームを作成
        let behaviorSubject = BehaviorSubject<Int>(value: 0)

        //ストリームを購読して、流れてきたイベントに応じた処理を定義
        behaviorSubject
            .subscribe(onNext: { value in
                print(value)
            }, onCompleted: {
                print("onCompleted")
            })
            .disposed(by: bag)

        behaviorSubject.onNext(1)
        behaviorSubject.onNext(2)
        behaviorSubject.onNext(3)
        behaviorSubject.onCompleted()
//        0
//        1
//        2
//        3
//        onCompleted

(エラーは流れないのでonNextとonCompletedの場合だけを定義しています)

PublishSubject

PublishSubjectは初期値の設定ができず、イベントはonNext, onError, onCompleteの3つのイベントを流すことができます。

        let publishSubject = PublishSubject<Int>()

        //イベントが流れてきたときの処理
        publishSubject.subscribe { value in
            print(value)
        }
        .disposed(by: bag)

        //onNextでイベントを流せる
        publishSubject.onNext(1)
        publishSubject.onNext(2)
        publishSubject.onNext(3)
        publishSubject.onCompleted()

//        next(1)
//        next(2)
//        next(3)
//        completed

BehaviorRelay

BehaviorRelayは初期値を設定することができ、イベントはonNextのみ流れます。

        let behaviorRelay = BehaviorRelay<Int>(value: 0)

        behaviorRelay
            .subscribe(onNext: { value in
                print(value)
            })
            .disposed(by: bag)

        behaviorRelay.accept(1)
        behaviorRelay.accept(2)
        behaviorRelay.accept(3)

//        0
//        1
//        2
//        3

RelayはonNextではなくacceptでイベントを流します。

PublishRelay

PublishRelayは初期値の設定ができず、イベントはonNextのみ流れます。

        let behaviorRelay = PublishRelay<Int>()

        behaviorRelay
            .subscribe(onNext: { value in
                print(value)
            })
            .disposed(by: bag)

        behaviorRelay.accept(1)
        behaviorRelay.accept(2)
        behaviorRelay.accept(3)

//        1
//        2
//        3

使い分け

  • Subject

    通信処理等でエラー処理を行いたいとき

  • Relay

    UIに表示するデータを格納するとき

0
2
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
0
2