我正在尝试检测是否有可观察的(我的情况按钮.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)
我的目标是每当按钮按下时动画视图未窃听三秒钟。我努力了scan, 直到改变为止 and debounce但我遇到的大多数组合运算符仅在可观察对象发出项目时才会发出项目。任何帮助深表感谢。
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()
}
})
-
timeout(_:scheduler:)
如果 3 秒内没有事件从链中发出,将引发错误。
-
catchErrorJustReturn(_:)
会将错误转化为.timeout
event
- 此时,如果 observable 超时,它也会完成,因此之后不会发生任何事情。使用
Observable.repeatElement(_:).concat()
我们首先创建一个Observable<Observable<Event>>
然后连接内部可观察值。在我们的例子中,这意味着我们将订阅第一个,如果第一个完成,则重新订阅相同的可观察值。
如果我们只想玩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 */})
这样,我们首先超时,然后仅在发生点击时发出事件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)