RxSwiftのPlaygroundを読んでみるシリーズ今回は
任意のタイミングで値を流す操作についてです。
(Connectable_Operators)
Connectable Operators
ObservableをConnectable Observableというものに変換する操作です。
Connectable Observableはconnectメソッドを呼ばないと値が流れません。
逆に、connectメソッドを呼ぶまで値が流れるのを止めておく、ということができます。
publish
シンプルに、connectメソッドを呼ぶと値が流れ始めるConnectableObservableにする。
let disposeBag = DisposeBag()
let publish = Observable
.just("🍑")
.publish()
publish
.subscribe { print($0) }
.addDisposableTo(disposeBag)
publish.connect() // ←このタイミングで値が流れる
結果
Next(🍑)
Completed
replay
connectメソッドを呼んだ後、
新たにsubscribeするものに対し、
bufferSize分前のイベントを流す。
let replay = ["🍑", "🍐", "🍎", "🍇", "🍊"]
.toObservable()
.replay(3)
replay
.subscribe { print("1:", $0) }
.addDisposableTo(disposeBag)
replay.connect() // ←このタイミングで値が流れる
replay
.subscribe {print("2:", $0) }
.addDisposableTo(disposeBag)
結果
1: Next(🍑)
1: Next(🍐)
1: Next(🍎)
1: Next(🍇)
1: Next(🍊)
1: Completed
2: Next(🍎)
2: Next(🍇)
2: Next(🍊)
2: Completed
multicast
指定した別のObservableに対しても同じ値を流す。
(値の型が一致してないといけない。)
let subject = PublishSubject<String>()
subject
.subscribe { print("PublishSubject:", $0) }
.addDisposableTo(disposeBag)
let multicast = Observable
.just("🍑")
.multicast(subject) // ←subjectにも値が流れる
multicast
.subscribe { print("multicst:", $0) }
.addDisposableTo(disposeBag)
multicast.connect() // ←このタイミングで値が流れる
結果
PublishSubject: Next(🍑)
multicst: Next(🍑)
PublishSubject: Completed
multicst: Completed
おわりに
ConnectableObservableへの変換はHot変換と呼ばれるそうです。
(HotなObservable とColdなObservable / Hot変換)
Cold/Hot Observableはまだ「うん?」という状態ですが、
ちゃんと押さえておく必要がありそうです。
次回はエラー処理についてです。