目次
1. share()とは
ひとことで言うと1回でイベントを流せる機能
です。
つまりは、1度subscribeしたものはもう2度とsubscribeしなくてOKな機能+1度でイベントを流し切る機能
です。
どう言うことか、実例を挙げてみていきます。
2. 実例
share()
を使わない例
まずはshare()
を使わずに書いてみます。(超非効率)
hasnoshare.swift
let subject = PublishSubject<Int>()
let observable = subject
.debug("observable")
observable
.bind(to: Binder(self) { _, value in
print("サブスクライバー1: \(value)")
})
.disposed(by: bag)
// 1回目のイベントを発行
subject.onNext(1)
observable
.bind(to: Binder(self) { _, value in
print("サブスクライバー2: \(value)")
})
.disposed(by: bag)
// 2回目のイベントを発行
subject.onNext(2)
実行結果
observable -> subscribed
observable -> Event next(1)
サブスクライバー1: 1
observable -> subscribed
observable -> Event next(2)
サブスクライバー1: 2
observable -> Event next(2)
サブスクライバー2: 2
とても冗長です。
まず、.bind
のサブスクライブ処理が2回走っています。observable.bind()
が呼ばれるたびにサブスクライブ処理が貼りまします。
次に、onNext(2)
がサブスクライバー毎に呼ばれているので、2回呼ばれています。
share()
を使った例
対して.share()
を使用した例です。
hasshare.swift
let subject = PublishSubject<Int>()
let observable = subject
.debug("observable")
.share() // これを追加するだけ
observable
.bind(to: Binder(self) { _, value in
print("サブスクライバー1: \(value)")
})
.disposed(by: bag)
// 1回目のイベントを発行
subject.onNext(1)
observable
.bind(to: Binder(self) { _, value in
print("サブスクライバー2: \(value)")
})
.disposed(by: bag)
// 2回目のイベントを発行
subject.onNext(2)
実行結果
observable -> subscribed
observable -> Event next(1)
サブスクライバー1: 1
observable -> Event next(2)
サブスクライバー1: 2
サブスクライバー2: 2
これで、サブスクライブ処理は1度のみ、.onNext(2)
は1度で2つのサブスクライバーを通っています!
簡単ですね!
3. おわりに
RxSwiftを触っていると、であったshere()
について解説しました。
RxSwiftのシェアは複数のサブスクライバーのストリームをひとつに束ねて、流れてくる値を複数のサブスクライバー間でシェアしているみたいです。
本記事を読んでいただきありがとうございました!