はじめに
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に表示するデータを格納するとき