Categories: iOS

Rxで1つ前のイベントを比較してイベントを発火させる

一つ前のイベントを取得して、前回の値と違ったらイベントを発火するということをしたかったのですが、なかなか出てこなかったので備忘録。 ヒントはこちらにありました。
Twitter for iOSには選択中のタブをもう1度タップしたら最上部までスクロールするという機能があります。便利ですね。
- blog.ishkawa.org
ただ、Observableの部分が省略されていったので、どうしたもんかなぁと思ったのですが、こんな感じでかけました。
let tappedIndex = ReplaySubject<Int>.create(bufferSize: 1)
そして、前回値と比較してイベントを発火するのはこんな感じで書きました。
var differenceObservable: Observable<Bool> {
    return Observable
        .zip(tappedIndex, tappedIndex.skip(1)) { previous, current in
            return previous != current
        }.filter { $0 }
        .asObservable()
    }
あとはdifferenceObservableに対してsubscribeしておけば違う値が来たときにだけイベントが発火する仕様の完成です。
differenceObservable
    .subscribe(onNext: { _ in print('do something') })
    .disposed(by: disposeBag)
この方法のミソはReplaySubjectは流れるイベントをbuffer分おぼえていて、skipを使えば指定したところのイベントがとれるので直前に流れたイベントを取得することができるって感じです。
mogmet

View Comments