gpt4 book ai didi

swift - 如何检测可观察对象是否在 RxSwift 中的特定时间未发出任何事件

转载 作者:可可西里 更新时间:2023-11-01 00:21:23 25 4
gpt4 key购买 nike

我正在尝试检测一个可观察对象(我的案例 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)

我的目标是在按钮未点击 三秒钟时为 View 设置动画。我已经尝试过scandistinctUntilChangeddebounce,但我遇到的大多数组合运算符仅在可观察对象发出项目时才会发出项目。非常感谢任何帮助。

最佳答案

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事件
  • 此时,如果 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 */})

这样,我们首先超时,但仅在发生点击时才发出事件。

关于swift - 如何检测可观察对象是否在 RxSwift 中的特定时间未发出任何事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42145623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com