LoginSignup
7
4

More than 5 years have passed since last update.

【Swift】RxSwiftのPlaygroundを読む⑦

Last updated at Posted at 2016-07-27

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はまだ「うん?」という状態ですが、
ちゃんと押さえておく必要がありそうです。

次回はエラー処理についてです。

参考

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4