🙆
RxSwiftのBehaviorRelayとPublishRelayの違いを、小学生でもわかるように説明する
はじめに
RxSwift / RxCocoa を使っていると頻繁に登場する BehaviorRelay と PublishRelay。
しかし「なんとなく使っているけど本当の違いがよくわからない…」という声をよく聞きます。
この記事では、まず 小学生でもわかる表現 で直感的な理解をし、そのあと実務的な使い分けまで整理します。
Relayは「値をみんなに伝えるための箱」
Relayは「値を流すストリーム」に イベントを入れる役割 を持ちます。
accept(_:) で値を流し、bind や subscribe で受け取ります。
PublishRelay ≒ 花火大会
PublishRelayは、何かが起きたときにだけ値を流します。
- 過去の値は覚えていない
- 起きた瞬間にしか伝わらない
例えると 花火大会の音 です。
花火が上がったときだけ「ドーン」と聞こえる
それまでには何も音はしません
よく使う場面
- ボタンが押された
- 画面を閉じてほしい
- APIリクエスト開始/完了などのイベント通知
let buttonTapped = PublishRelay<Void>()
buttonTapped.accept(()) // イベントだけを流す
BehaviorRelay ≒ 温度計(状態を保持)
BehaviorRelay は 常に最新の値を覚えています。
- 初期値が必要
- .value で現在値を取り出せる
例えると 温度計 です。
「今の気温は何度?」と聞くと、いつでも答えられる
よく使う場面
- UI の状態
- 入力フォームの内容
- アプリ内の設定・選択状態管理
let brightness = BehaviorRelay<Int>(value: 80)
brightness.accept(100) // 値を更新
print(brightness.value) // => 100(今の状態)

Discussion