🙆

RxSwiftのBehaviorRelayとPublishRelayの違いを、小学生でもわかるように説明する

に公開

はじめに

RxSwift / RxCocoa を使っていると頻繁に登場する BehaviorRelayPublishRelay
しかし「なんとなく使っているけど本当の違いがよくわからない…」という声をよく聞きます。

この記事では、まず 小学生でもわかる表現 で直感的な理解をし、そのあと実務的な使い分けまで整理します。


Relayは「値をみんなに伝えるための箱」

Relayは「値を流すストリーム」に イベントを入れる役割 を持ちます。
accept(_:) で値を流し、bindsubscribe で受け取ります。


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