MENU

【RxSwift】1回で効率よくイベントを流すshare()

目次

1. share()とは

ひとことで言うと1回でイベントを流せる機能です。
つまりは、1度subscribeしたものはもう2度とsubscribeしなくてOKな機能+1度でイベントを流し切る機能です。
どう言うことか、実例を挙げてみていきます。

2. 実例

share()を使わない例

まずはshare()を使わずに書いてみます。(超非効率)

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()`を使用した例です。

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)
Bash:実行結果
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のシェアは複数のサブスクライバーのストリームをひとつに束ねて、流れてくる値を複数のサブスクライバー間でシェアしているみたいです。
本記事を読んでいただきありがとうございました!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Rio@iOSエンジニアのアバター Rio@iOSエンジニア 経営者兼モバイルアプリエンジニア

都内のモバイルアプリ開発会社経営者。
モバイルアプリの新規の請負開発及び保守運用を引き受ける。
Denso→Honda→現在
#RxSwift #MVVM #Firebase #Python3

コメント

コメントする

目次