はじめに
前回はSubjectの3種類について書きました。
今回は、BehaviorRelayについて書きたいと思います。
なぜBehaviorRelayについて書こうかと思ったかというと、KodecoのRxSwiftを学ぶページ(
Getting Started With RxSwift and RxCocoa)でいきなりBehaviorRelayが出てきたからです。この手順通りにやると、確かにModelの変更が即座にViewに反映するようになるのですが、なぜBehaviorRelayなのか、どういった機能を持っているのかがわからなかったので、調べました。
BehaviorRelayについて
前回行ったSubjectと違い、BehaviorRelayはRxSwiftではなくRxCocoaで提供されています。
特徴
・BehaviorSubjectの一部をラッパーしている(挙動はBehaviorSubjectに似ている?)
・エラーやコンプリートで終了しない
・外部から直接値の変更を防ぐため、asObservableというメソッドで読み取り専用のObservableを生成する
・valueプロパティを持つ
・valueプロパティの変更にはacceptメソッドを使用
まだあるかもしれませんが、とりあえず主要な特徴を書いてみました。
ざっくりメリットをいうと、エラーや完了イベントを発行しないので、使用場面は選ぶ必要があると思いますがエラーハンドリングの必要もなく、常にデータの変更を観察し続けられること。
オブザーバーには読み取り専用のObservableを渡すので、予期せず値が変更されることを防ぐことができることなどが挙げられると思います。
特にUIの更新などに適していると思われます。
let relay = BehaviorRelay(value: "Initial value")
let observable = relay.asObservable()
observable.onNext("New value") // エラー: 'onNext' is inaccessible due to 'internal' protection level
使い方は以下
let relay = BehaviorRelay(value: "Initial value")
let subscription = relay.asObservable()
.subscribe(onNext: { value in
print(value) // ここで初期値の"Initial value" が出力される
})
relay.accept("New value") // "New value"が通知される
})
ちなみに、私はSubjectのシーケンスと混合してしまっていたのですが、
BehaviorRelayのvalueプロパティは値を保持しその変更を通知することができます。
なので上記サンプルのように文字列単体を入れることができますし、整数も配列も入れることが可能です。
最後に
ここまでRxSwiftを学んできて、大事なのは「何が」発生したときに「何を」すべきかを実装できる点だと思いました(個人の感想です)。RxSwiftの説明を最初に読むと、時間の流れがとか、シーケンスがといった説明が出てくるので最初かなり混乱しました。これらの説明はおそらく正確で正しく理解する必要があるかと思いますが、まずは「あるイベントが発生したときに何をすべきか」を実現できるものとして進めていくのが良いのではないかと思いました。
引き続きRxSwiftについて書いて行きたいと思います。
ここまで読んでくださりありがとうございます!