LoginSignup
0
0

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

Posted at

目次

1.share()とは
2.実例
3.おわりに

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

0
0
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
0
0