やったこと
如法会に参加した。「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_tap
はrx_controlEvent(.TouchUpInside)
のことでTouchUpInsideのイベントだけに限定されてイベントが発生するみたいであった。他のイベントでごにょりたいのであれば、これをつかえばよさそうである。
bufferは1秒に1回ほど、イベントをまとめるようにしたが、イベントが起きない場合でも1秒に1回イベントが起きてしまう。そのためfilterを掛ける必要がある。
subscribeNext
は.Next
なイベントがやってきたときだけ処理する内容が登録できるようだ。
debug
を挟めば、イベントをログに挟めてとても便利であった。
次にしたいこと
- このままでは、同じボタンに
rx_tap.subscribeNext
で処理をしてもダブルタップ時にシングルタップのイベントを2つ創出してしまう。なんとかしたい。 - その他のオペレーターの動きも確認したい。