【RxSwift】Subjectとは?Relayとの違いと使い方

この記事からわかること
- RxSwiftのSubjectとRelayの違いと使い方
- PublishとBehaviorの違い
index
[open]
\ アプリをリリースしました /
RxSwiftのイベントの検知と発生を行えるクラスであるSubjectとRelayの概要と使い方などをまとめていきます。
おすすめ記事:【RxSwiftとは?導入方法と使い方まとめ!ストリームを理解する
Subjectとは?
SubjectとはRxSwiftにおけるイベントの検知と発生が可能なクラスです。RxSwiftにおいてイベントの検知が可能なクラスといえばObservable
クラスですがさらに自身でイベント流せるのが大きな違いです。
流せるイベントはonNext
、onError
、onCompleted
の3つです。
さらにSubjectの中には「Publish」と「Behavior」に分かれそれぞれのクラスが定義されてます。両者の違いはバッファ(※)を持つか持たないかです。バッファを持つBehaviorは過去のイベントを受け取ることができるようになります。
※バッファとはデータを一時的に記憶する場所を指すような言葉です。
Relayとは?
Relay
もSubjectと同じイベントの検知と発生が可能なクラスです。
ただしこちらは流せるイベントがonNext
のみとなっています。「Publish」と「Behavior」に分かれる点は同じです。
まとめ
クラス名 | 流せるイベント | バッファ |
---|---|---|
PublishSubject | onNext、onError、onCompleted | 無 |
BehaviorSubject | onNext、onError、onCompleted | 有 |
PublishRelay | onNext | 無 |
BehaviorRelay | onNext | 有 |
Subjectの使い方
Subjectは自身でイベントを流せるクラスでした。これを使って独自でイベントを発生させるViewModelクラスを作成してみます。ここでのポイントは以下の通りです。
- privateでSubjectを定義
- publicでObservableクラスを定義
- 任意のメソッドに自由にイベントを定義
import UIKit
import RxSwift
import RxCocoa
class SampleModel{
private var subject = PublishSubject<String>()
public var observable :Observable<String>{
return subject.asObservable()
}
func call(){
subject.onNext("Hello World")
subject.onCompleted()
}
}
ViewModelとして使用したいのでイベントの発行が内部のみに限定するためにprivate
で定義し、Observableクラスには外部から使用できるように分かりやすくpublic
を付与しておきます。
あとは任意のイベントを任意の回数定義したメソッドなどを用意しておけばViewModelを介してイベントの発行と取得を行うことができるようになります。
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
private let disposeBag = DisposeBag()
private let viewModel = SampleModel()
private var label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.frame = CGRect(x:0, y:0,width:100, height:50)
label.text = "placeholder..."
label.center = self.view.center
self.view.addSubview(label)
// 購読開始
viewModel.observable.subscribe { text in
self.label.text = text
}.disposed(by: disposeBag)
// イベントを発火
viewModel.call()
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。