sub*_*ash 1 reactive-programming swift rx-swift rx-cocoa
我试图检测一个observable(我的情况button.rx.tap)是否没有发出任何值,比如3秒.如果是,我想更新用户界面.这是我到目前为止的尝试:
Observable<Int>.interval(3, scheduler: MainScheduler.instance)
.takeUntil(button.rx.tap) // I know take until will stop the timer sequence
.subscribe({ event in
print(event)
UIView.animate(withDuration: 0.4, animations: {
if let number = event.element {
let scale: CGFloat = number % 2 == 0 ? 1.5 : 1.0
self.button.transform = CGAffineTransform(scaleX: scale, y: scale)
}
})
})
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
我的目标是在没有按下按钮三秒钟时为视图设置动画.我已经尝试过扫描,distinctUntilChanged和debounce但是我遇到的大多数组合运算符只会在observable发出一个项目时才会发出项目.任何帮助深表感谢.
enum Event {
case tap
case timeout
}
let tapOrTimeout = button.rx.tap
.map { _ in Event.tap }
.timeout(3, scheduler: MainScheduler.instance)
.catchErrorJustReturn(.timeout)
Observable.repeatElement(tapOrTimeout).concat()
.subscribe(onNext: { event in
switch event {
case .tap: tapHandler()
case .timeout: callForAttention()
}
})
Run Code Online (Sandbox Code Playgroud)
timeout(_:scheduler:) 如果在3秒内没有事件从链中出来,将引发错误.catchErrorJustReturn(_:)将错误转换为.timeout事件Observable.repeatElement(_:).concat()我们首先创建一个Observable<Observable<Event>>然后连接内部observable.在我们的情况下,这意味着我们将订阅第一个,并且如果第一个完成则重新订阅相同的observable.如果我们只想播放callForAttention()一次动画,我们可以做到以下几点
let tap = button.rx.tap
.map { _ in Event.tap }
let tapOrTimeout = tap
.timeout(3, scheduler: MainScheduler.instance)
.catchErrorJustReturn(.timeout)
Observable.of(tapOrTimeout, tap).concat()
.subscribe(onNext: { /* same as above */})
Run Code Online (Sandbox Code Playgroud)
这样,我们首先超时,但只在发生敲击时才发出事件.
| 归档时间: |
|
| 查看次数: |
2648 次 |
| 最近记录: |