【RxSwift】BehaviorRelayとPublishRelayについてまとめてみた

公開日: : iOSアプリ開発

こんにちは、@akio0911です。今回はRxSwiftのBehaviorRelayとPublishRelayについてまとめてみました。

BehaviorRelayとPublishRelayは、.nextだけ流せる

BehaviorRelayとPublishRelayは、.nextだけ流せます。つまり、.errorや.completedが流れてこないことを保証できます。.nextイベントを流すにはacceptメソッドを使います。

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

behaviorRelay.subscribe { event in
	print(event)
}.disposed(by: disposeBag)

behaviorRelay.accept(2)
behaviorRelay.accept(3)
behaviorRelay.accept(4)

// 実行結果
// next(1)
// next(2)
// next(3)
// next(4)
let publishRelay = PublishRelay<Int>()

publishRelay.subscribe { event in
	print(event)
}.disposed(by: disposeBag)

publishRelay.accept(1)
publishRelay.accept(2)
publishRelay.accept(3)

// 実行結果
// next(1)
// next(2)
// next(3)

BehaviorRelayは初期値を持ち、PublishRelayは初期値を持たない

BehaviorRelayは初期値を持ち、PublishRelayは初期値を持ちません。

// 初期値を持つ
let behaviorRelay = BehaviorRelay<Int>(value: 1)

// 初期値を持たない
let publishRelay = PublishRelay<Int>()

BehaviorRelayはvalueプロパティを持ち、PublishRelayはvalueプロパティを持たない

BehaviorRelayはvalueプロパティを持ち、PublishRelayはvalueプロパティを持ちません。

let behaviorRelay = BehaviorRelay<Int>(value: 1)
let publishRelay = PublishRelay<Int>()

behaviorRelay.value
// publishRelay.value // PublishRelayにvalueプロパティは存在しない

subscribeした時、BehaviorRelayは現在値を流し、PublishRelayは現在値を流さない

subscribeした時、BehaviorRelayは現在値を流しますが、PublishRelayは現在値を流しません。

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

behaviorRelay.subscribe { event in
	print("behaviorRelay", event)
}.disposed(by: disposeBag)

let publishRelay = PublishRelay<Int>()

publishRelay.subscribe { event in
	print("publishRelay", event)
}.disposed(by: disposeBag)

// 実行結果(publishRelayの現在値は流れてこない)
// behaviorRelay next(1)

まとめ

もし誤りなどがあれば、Twitter(@akio0911)などで指摘して頂けると助かります!

この記事を書いた人
あきお(@akio0911
iOSエンジニア、ブロガー。「プログラミングで人々を幸せに」をテーマに活動中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。 MAMORIO株式会社 技術顧問(インタビュー記事)、VISITS Technologies株式会社 技術顧問(インタビュー記事)。ブログ「卵は世界である」を運営。

関連記事

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

【入門】プログラム・プログラミング・プログラミング言語とは?

こんにちは、@akio0911です。 今回は「プログラム」「プロ

【入門】プログラミング未経験者向けのプログラミング入門連載記事を始めます

こんにちは、@akio0911です。 これからプログラミング未経

【RxSwift】BehaviorRelayとPublishRelayについてまとめてみた

こんにちは、@akio0911です。今回はRxSwiftのBe

【RxSwift】materialize, dematealizeを使ってみた

@toshi0383さんに教えていただいた、RxSwiftのm

【RxSwift】ストリームのcompletedをつぶす(消し去る)方法

RxSwiftで元々のストリームからcompletedをつぶす

→もっと見る

PAGE TOP ↑