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

2023-12-30

我正在尝试检测是否有可观察的(我的情况按钮.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(使用前将#替换为@)

如何在 RxSwift 中检测可观察对象在特定时间内是否未发出任何事件 的相关文章

  • 将发布者组合分配给 PassthroughSubject

    我有以下 RxSwift 视图模型代码 private set var num BehaviorRelay
  • Swift 中的协议与多态性

    我对面向对象编程相当陌生 我正在尝试了解协议 委托和多态性 我最近观看了一个培训视频 其中宣传当您有两个相似且具有相似方法实现的类时 协议是优雅地实现此目的的最佳解决方案 这就说得通了 然而 一些额外的研究让我发现了多态性 听起来这也是一种
  • 从两种不同类型的数组中获取公共数据

    struct Human let name String let id String let travelled String struct Animal let name String let id String let travelle
  • xcode 9 中的 Facebook 登录按钮终止

    我正在使用 Xcode 9 并将编译器设置为 Swift 3 2 我使用 Cocoapods 安装了 Facebook Login 一切都编译没有任何错误 但每当我在模拟器中运行它时 我单击登录按钮 它就会崩溃 控制台中仅打印以下内容 li
  • 在 SwiftUI 文档应用程序中,如何从函数内保存文档

    当前版本的 Xcode 版本 12 5 1 为 macOS 的基于文档的应用程序提供了一个模板 提供以下文档模型 struct MyDocument FileDocument var text String init text String
  • 删除 UISearchBar 中的清除按钮

    我想从 UISearchBar 中删除清除按钮 灰色 x 我尝试按照中的描述进行操作这个答案 https stackoverflow com a 19458201 但它不起作用 我将 Objective C 代码从下面的答案和评论翻译为以下
  • Health 处理多个步骤源的方式与 HealthKit 不同——swift

    我的 Swift iOS 应用程序与 HealthKit 连接 向用户显示他们当天到目前为止已经走了多少步 在大多数情况下 这是成功的 当步数的唯一来源是 iPhone 内置计步器功能记录的步数时 一切正常 并且我的应用程序显示的步数与健康
  • Swift:在后台同步执行代码; queue.sync 没有按我的预期工作

    我想在后台同步执行一些代码 我真的认为这是正确的方法 let queue DispatchQueue global qos default queue async print Thread isMainThread 但这打印true除非我用
  • 使用 NSXMLParser 在 Swift 中解析分层 XML

    我确实在以我实际可以使用的形式获取分层 XML 值时遇到问题 因此我们将不胜感激 我对 Swift 和 IOS 开发还很陌生 所以说实话我并不完全理解解析器 但我希望在这之后我能理解 下面是我尝试解析的示例 XML 它来自肥皂网络服务 连接
  • 带 cookie 的 Alamofire 请求

    我是初学者 我不知道如何使用 Alamofire 发出 GET 请求 但它需要身份验证 我设法用其他网络服务 登录 来做到这一点 因为它需要参数参数 parameters username username password passwor
  • 二元运算符“&=”不能应用于 Swift 中的两个“Bool”操作数

    我正在尝试进行多次检查 将结果累积在Bool 我的代码是 var validParams login characters count gt 4 validParams password characters count gt 6 vali
  • keyPathsForValues影响 NSManagedObject

    你好 我想将亚伦书中的客观练习翻译为 swift 但我找不到解决方案 Objective c 代码是 dynamic firstName dynamic lastName dynamic department NSSet keyPathsF
  • 是否可以快速读取权利文件

    我正在我的应用程序中实现通用深度链接 当我注册不同的域时 它会创建一个 AppName entitlements 文件 我想像 plist 一样读取这个文件的值 I tried if let path NSBundle mainBundle
  • 使用 Codable 将字符串编码/解码为整数,并在其间使用函数

    我有这个 json 字符串 let json name Wendy Carlos hexA 7AE147AF hexB 851EB851 let data Data json utf8 我想使用 Codable 对该结构进行编码 或返回 s
  • 无效的 Swift 支持 - 文件位置不正确

    我一直在尝试将新版本上传到 iTunes Connect 来更新应用程序 我第一次使用 xCode 6 但收到了一封来自 Apple 的电子邮件 内容如下 亲爱的开发者 我们发现您最近交付的 应用程序 存在一个或多个问题 要处理您的交货 必
  • 快速更改日期选择器语言

    我想更改 UIDatePicker 中月份表示的格式 我试过 self datePicker UIDatePicker self datePicker backgroundColor white self datePicker datePi
  • 将 3D 对象添加到 ARGeoAnchor

    如果这个问题不太好 请原谅我 我在 Apple 的 ARGeoAnchor 文档中遇到了一些障碍 目前 ARGeoAnchor 仅在 AR 场景视图中显示一个蓝点 我正在尝试显示任何 3D 渲染或对象 My code let coordin
  • 在 iMessage 应用程序中检查横向/纵向方向(扩展)

    见过很多检查方向的解决方案 但奇怪的是 没有一个有效 下面是代码片段 override func viewWillTransition to size CGSize with coordinator UIViewControllerTran
  • 如何显示启动图像

    我是 iOS 新手 我的 Xcode 版本是 7 2 1 我尝试使用 Swift 在 iOS9 上运行 我的问题是我对如何创建启动屏幕图像感到非常困惑 我发现有很多方法可以为不同版本的 iOS 创建启动屏幕图像 有人可以向我解释一下如何设置
  • 如何在 iOS 11 上的 Swift 中获取 FLAC 文件元数据?

    我需要获取 FLAC 文件的元数据 我尝试了以下代码 let item AVPlayerItem url URL fileURLWithPath path let commonMetadata item asset commonMetada

随机推荐

  • 如何在 DAX (Power BI Desktop) 中计算总价值的百分比

    我在 Power BI Desktop 中有以下切片器 其中客户数量计算为计数 不同 Fact EHRTransaction ClientFK 在我的数据模型中 我的目标是计算占总数的百分比 13 639 并将其作为度量或另一个列添加到此切
  • parse(text = str) 中出现意外符号错误,数字后带有连字符

    我正在尝试解析 R 中的字符串 当字符串中存在数字后跟连字符时 R 会抛出 意外符号 或 意外输入结束 异常 请参阅代码 搜索并尝试不同的方法来解决这个问题并没有帮助 可能是我的知识匮乏 任何帮助或建议将不胜感激 gt str lt abc
  • Umbraco 5询问用户是否有节点权限

    我正在使用 Umbraco 5 1 beta 在互联网上 此信息来自以前的版本 找不到最新的文档 我发现我可以询问节点用户是否具有访问权限 这样我想建立我的菜单 问题是 我无法让它工作 HasAccess 和 IsProtected 属性不
  • 如何使用 SwiftUI 扩展按钮的宽度

    我不知道如何更改 SwiftUI 中按钮的宽度 我已经尝试过 使用 frame minWidth 0 maxWidth infinity 在按钮和导航链接周围使用 Spacer 在文本字段上使用框架并在按钮上使用填充 查看文档以及我在网上搜
  • 为什么 PHP 对象运算符在浏览器中被视为结束标记? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 使用其他数组对对象数组进行排序

    我创建了这个对象数组 const palette color Blue brightness Soft color Blue brightness Medium color Blue brightness Principal color M
  • Magento 重写 getPrice()

    我已经通过覆盖 Magento 产品的价格规则getPrice 方法在 Mage Catalog Model Product Type Price 类 简单的产品工作正常 并显示我在中提到的更新价格getPrice i e public f
  • Haproxy ssl重定向握手失败

    我有 haproxy v1 5 4 可以使用 http 和 https 我将 80 和 443 绑定到相同的前端并使用相同的 acl 我想创建一个 http gt https 重定向 frontend http in bind 80 bin
  • NSXMLparser 错误代码 5

    我在我的应用程序中使用亚马逊的 simpledb 解析 xml 时出现错误 代码为 5 IE NSXMLParserErrorDomain 错误 5 有时它工作正常 并且导航没有任何重大变化就会出现该错误 当我多次重新启动应用程序而无需对系
  • Android:如何在主项目中使用测试项目

    我想在 Eclipse 中创建这样的项目结构 并将其与 Maven 一起使用 MyProject AndroidManifest xml res resources for main application src source code
  • div元素中额外空间的解决方案

    在我的应用程序中我使用的是div元素 div 元素下方和上方有一些额外的空间 我怎样才能删除它 Thanks 每个浏览器都有自己的各种元素的边距和填充的默认值 所以除非你明确设置例如 div margin 0 padding 0 在你的 C
  • 如何在不创建数据库的情况下保存谜语游戏的答案?

    我创建了一个具有不同级别的问答游戏 每个级别都包含一个问题 我没有用数据库创建它 我只是用了字符串 当用户回答第一级的问题时 他会被带到第二级 但是当用户返回到第一级时 他必须再次输入答案 即使他之前已经解决了该问题 无论如何 JAVA 是
  • Firemonkey Delphi TWebBrowser 获取文本/HTML

    我如何从 Firemonkey 平台 Android iOS 上的网页获取文本 html TWebBrowser 没有任何这方面的东西 经过一些测试 我结合了JAVAScript和Delphi代码 有一个workground 请参考我的文章
  • 不带列名的动态汇总

    如何根据列的字符串数组动态构造汇总语句 deviceTelemetry summarize
  • Node 7.1.0 new Promise() 解析器未定义不是函数

    我在 OSX 上使用最新的节点版本 7 1 0 但我仍然无法使用 Promises 我明白了 index js new Promise Error new Promise 类型错误 未定义的承诺解析器不是函数 Node 7 1 0不支持ES
  • 访问模块内的 IRQ 描述数组并显示操作名称

    我正在用 C 语言编写一个内核模块 该模块正在努力访问 IRQ 描述数组元素并显示这些元素的所有操作名称 一开始 我认为这个 irq desc 数组就像一个宏 但编译后我明白它不是 然后我使用了 for each irq desc irq
  • 安装 python 模块时出错

    我正在尝试使用标准安装 python 模块python setup py install但我收到以下错误 我对 python 相当陌生 但过去我已经能够以这种方式安装其他模块 我对这个模块的印象setuptools不是我应该从我的 pyth
  • 将初始查询集限制为 django-rest 框架中分页中的对象

    我正在定义一个ModelViewSet using django rest framework 我需要覆盖默认查询集 以便在渲染响应之前对查询集对象执行一些处理 这个过程非常耗时 因此我只想在由于分页响应而实际可供消费者使用的对象上执行它
  • oracle 18中通过json_table解析json

    有一个请求例如 with j sJson as select ID 1444284517 ID ORD 4255 2187606199 Vals CODE ONB2B3BB8 DORD 25 04 2021 from dual select
  • 如何在 RxSwift 中检测可观察对象在特定时间内是否未发出任何事件

    我正在尝试检测是否有可观察的 我的情况按钮 rx tap 在 3 秒内没有发出任何值 如果是的话 我想更新用户界面 到目前为止 这是我的尝试 Observable