Posted at

RxSwiftでダブルタップ

More than 3 years have passed since last update.


やったこと

如法会に参加した。「Swiftと機械学習おうちでもくもく会」だったので、RxSwiftの練習をした。

そんなわけで、RxSwiftでダブルタップの処理に挑戦した。

import UIKit

import RxSwift
import RxCocoa

class ViewController: UIViewController {

@IBOutlet weak var sampleButton: UIButton!
let disposeBag = DisposeBag()

override func viewDidLoad() {
super.viewDidLoad()

sampleButton.rx_tap
.buffer(timeSpan: 1, count: 2, scheduler: MainScheduler.instance)
.filter { $0.count == 2 }
.subscribeNext { _ in
print("Doulbe tap")
}.addDisposableTo(disposeBag)
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}

RxSwift で UIKit を扱う基本を参考にしてRxSwiftに入門した。


わかったこと

主なロジックはここ。

swift

sampleButton.rx_tap

.buffer(timeSpan: 1, count: 2, scheduler: MainScheduler.instance)

.filter { $0.count == 2 }

.subscribeNext { _ in

print("Doulbe tap")

}

rx_taprx_controlEvent(.TouchUpInside)のことでTouchUpInsideのイベントだけに限定されてイベントが発生するみたいであった。他のイベントでごにょりたいのであれば、これをつかえばよさそうである。

bufferは1秒に1回ほど、イベントをまとめるようにしたが、イベントが起きない場合でも1秒に1回イベントが起きてしまう。そのためfilterを掛ける必要がある。

subscribeNext.Nextなイベントがやってきたときだけ処理する内容が登録できるようだ。

debugを挟めば、イベントをログに挟めてとても便利であった。


次にしたいこと


  • このままでは、同じボタンにrx_tap.subscribeNextで処理をしてもダブルタップ時にシングルタップのイベントを2つ創出してしまう。なんとかしたい。

  • その他のオペレーターの動きも確認したい。