Rxで1つ前の値を取得する
Twitter for iOSには選択中のタブをもう1度タップしたら最上部までスクロールするという機能があります。便利ですね。
こういう機能を実装するには、1つ前に選択されていた値が何なのか知る必要があります。
桶の時代にはプロパティに前回の値を保存するのが定石でしたが、川の時代にはskip(1)
してzip()
するというのが定石です(たぶん)。
let tappedIndex: Observable<Int> = ...
Observable
.zip(tappedIndex, tappedIndex.skip(1)) { currentIndex, previousIndex in
return currentIndex == previousIndex
}
.filter { $0 }
.subscribeNext { _ in
// 最上部までスクロール
}
.addDisposableTo(disposeBag)
この手はスクロール速度の取得にも応用できます。
let scrollView: UIScrollView = ...
let offset = scrollView.rx_contentOffset
let velocityY = Observable
.zip(offset, offset.skip(1)) { currentOffset, previousOffset in
return currentOffset.y - previousOffset.y
}