当前位置: 首页 > 知识库问答 >
问题:

如何在RxSwift中检测可观察对象是否在特定时间内没有发出任何事件

充鑫鹏
2023-03-14

我试图检测一个可观察的(我的case按钮.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)

我的目标是在三秒钟内不点击按钮时使视图动画化。我已经尝试过扫描、不间断更改和防抖,但是我遇到的大多数组合运算符只有在项目被可观察的对象发出时才会发出项目。非常感谢任何帮助。

共有1个答案

燕朝明
2023-03-14
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(_:调度程序:)如果在3秒内没有事件从链中出来,将引发错误。
  • catchErrorJustBack(_:)将错误转换为. timeout事件
  • 此时,如果可观察的超时,它也将完成,因此之后不会发生任何事情。使用Observable.repeatElement(_:). conat()我们首先创建一个可观察的

如果我们只想播放一次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 */})

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

 类似资料:
  • 我的用例如下: 我创建了一个可观察的来访问远程服务器以获取一些数据。但是,由于服务器设计不完善,因此可能永远没有响应,也没有异常。为了解决这个问题,我希望有一些超时重试机制。 目前,我尝试启动一个计时器来停止请求,并在请求中抛出异常,然后重试,直到达到一定的尝试次数或实际超时。我试着使用操作符将请求与映射为使用,但是我无法在订阅服务器中捕获错误,它看起来像是可以观察到的永远不会结束。 对于RXJA

  • 因此,我有了这个存储库层,它返回一个 在我的ViewModel中,我有以下代码 在我的ViewController中,我有 这不起作用。任何帮助都是非常感激的。

  • 问题内容: 嗨,我正在尝试检查当前时间是否在某个时间范围内,例如8:00-16:30。下面的代码显示可以将当前时间作为字符串获取,但是不确定如何使用此值来检查它是否在上面指定的时间范围内。任何帮助将不胜感激! 问题答案: 有很多方法可以做到这一点。就我个人而言,如果可以避免的话,我不喜欢使用字符串。我宁愿处理日期组件。 下面的代码创建的日期为8:00和16:30,然后比较日期以查看当前日期/时间是

  • 问题内容: 如何检查对象在JavaScript中是否具有特定属性? 考虑: 那是最好的方法吗? 问题答案: 我对所给出的答案感到困惑-他们中的大多数都是完全错误的。当然,您可以拥有具有未定义,空值或假值的对象属性。因此,简单地将属性检查减少到甚至更糟,将给您完全误导的结果。 这取决于您要查找的内容。如果您想知道一个对象是否物理上包含一个属性(并且它不是来自原型链的某个地方),那么您就可以这样做。所

  • 问题内容: 我需要检查当前时间是否在8 AM和3 PM之间。如果在这些时间范围之间,那么我需要返回yes,否则返回false。 但是我不确定我应该在这里使用吗?我可以不使用时间戳并相应地检查时间戳吗?什么是正确的方法? 我仍在使用Java 7。 问题答案: 如果您使用的是Java 8之前的Java版本,请查看Joda的API文档。 具体来说,有一个AbstractInterval#contains

  • 问题内容: 我想检测特定页面是否已在内存中映射。目的是能够在使用固定内存地址调用mmap之前执行此检查。以下代码说明了默认情况下的情况:mmap默默地重新映射原始内存页面。 我知道我可以打开并解析/ proc / self / maps来确定已分配的内存范围,并从中推断出以下内容:如果我可以使用mmap安全地请求特定的内存范围,但是我正在寻找合适的API:一个东西 ? 问题答案: msync(ad