使用 RxSwift 实现简单的可观察结构?

2023-12-07

我试图在 Swift 中提出一个简单的可观察对象并考虑使用RxSwift。我找不到一个简单的例子来做这样的事情:

protocol PropertyObservable {
  typealias PropertyType
  var propertyChanged: Event<(PropertyType, Any)> { get }
}

class Car: PropertyObservable {
  typealias PropertyType = CarProperty
  let propertyChanged = Event<(CarProperty, Any)>()

  dynamic var miles: Int = 0 {
    didSet {
      propertyChanged.raise(.Miles, oldValue as Any)
    }
  }

  dynamic var name: String = "Turbo" {
    didSet {
      propertyChanged.raise(.Name, oldValue as Any)
    }
  }
}

以上是针对可观察量的纯 Swift 解决方案这篇博文;我真的很喜欢它是一个基于协议的解决方案,而不是侵入性的。就我而言,我的项目中有一个对象,其中每个属性都是在后台(蓝牙设备)异步设置的。所以我需要观察/订阅更改,而不是实时获取/设置属性。

我一直听说 RxSwift 会做到这一点,甚至更多。然而,我找不到一个简单的例子来匹配上面的内容,并开始认为 RxSwift 对于我的需求来说太过分了?谢谢你的帮助。


使用 RxSwift 快速观察这一点的最简单方法可能是使用 RxSwift 类变量(这里的所有代码都未经我的测试):

import RxSwift

class Car {

  var miles = Variable<Int>(0)

  var name = Variable<String>("Turbo")

}

这使您能够通过订阅来观察这些值:

let disposeBag = DisposeBag()
let car = Car
car.name.asObservable()
  .subscribeNext { name in print("Car name changed to \(name)") }
  .addToDisposeBag(disposeBag) // Make sure the subscription disappears at some point.

现在你已经失去了每个事件的旧值。当然有很多方法可以解决这个问题,RxSwifty 方法可能是添加一个扫描操作到您的元素序列,它的工作方式很像普通数组上的reduce:

car.name.asObservable()
  .scan(seed: ("", car.name.value)) { (lastEvent, newElement) in
    let (_, oldElement) = lastEvent
    return (oldElement, newElement)
  }
  .subscribeNext { (old, new) in print("Car name changed from \(old) to \(new)") }
  .addToDisposeBag(disposeBag)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 RxSwift 实现简单的可观察结构? 的相关文章

随机推荐

  • 递归地进行更改:如何修改算法以打印所有组合?

    我有一个算法 可以通过以下方式递归地进行更改 public static int makeChange int amount int currentCoin if amount zero we are at the bottom of a
  • 将包含列表的 pandas 列“unstack”成多行[重复]

    这个问题在这里已经有答案了 假设我有以下 Pandas 数据框 df pd DataFrame a 1 2 3 b 1 2 2 3 4 5 a b 0 1 1 2 1 2 2 3 4 2 3 5 我如何 取消堆叠 b 列中的列表以便将其转换
  • WCF:使用 WsHttpBinding 是否可以互操作?

    顾名思义 现在我正在使用 BasicHttpBinding 但我想知道是否可以切换到 WSHttpBinding 并且仍然可以与 Java 等设备进行互操作 wsHttpBinding 和较新的 ws2007HttpBinding 都实现
  • r for 回归循环 lm(y~x)

    Example df lt data frame A 1 5 B 2 6 C 3 7 D 4 8 E 5 9 F 6 10 我想使用像 y 一样的列 1 和 2 以及像 x 一样的其余列来制作回归循环 lm y x my idea lmf
  • 将动态生成的列表中的数据从一个页面传递到另一页面

    在我的 jquery 移动应用程序中 我有一个动态生成的列表视图 我想要做的是当用户单击列表项时 我想从列表项中的隐藏字段获取一个值并将该值传递到另一个页面 以便我可以根据该变量值进行查询 这是多页布局 由于我与第一页位于同一 DOM 中
  • 如何在android中制作通话记录应用程序

    我是一名 android 新手程序员 我想制作一个 android 应用程序来记录电话活动 例如来电 去电或未接来电 并将日志记录到文件 txt 我应该怎么办 请帮我 看一眼通话记录 通话 以下是一些有关使用通话记录的好教程 android
  • 当 JSONP 和 CORS 等解决方法存在时,为什么浏览器有同源策略?

    这个问题有点重复 为什么 XMLHttpRequest 的同源策略 然而 这个答案并不令人满意 因为它没有解决存在解决方法的事实 如问题中所述 答案仅解决与 XMLHttpRequest 直接相关的安全问题 但 JSONP 仍然存在这些问题
  • jquery 一对一切换多个div

    我想做的是在不同的 div 之间切换 这有点难以解释 但我会尝试一下 当页面加载时 将有一个可见的 div 和 4 个带有 display none 的 div 会有一个菜单 链接 1 将显示第一个 div 并隐藏所有其他 div 然后 当
  • Swift 中按属性对类或结构数组进行排序的通用函数

    我想创建一个通用函数来根据传递的属性对类数组进行排序 例如 我有这些课程 public class Car var id Int var manufacturer String var variant String init id Int
  • JPA、SQlite没有这样的表:SEQUENCE

    我对 JPA 和 SQlite 有疑问 我已经从表创建了一个实体 我生成的实体如下所示 Entity Table name sqliteTestTable public class Test implements Serializable
  • 相同代码中的行为不一致

    运行物理模拟大约 20 分钟后会出现错误陷阱 意识到这对于调试来说是一件痛苦的事情 我在一个新项目中复制了相关的子例程 并在错误发生时使用原始输入数据的硬编码副本来调用它 但错误陷阱并没有跳出来 经过两天繁琐的工作来隔离子例程的两个实例的行
  • 将文本从 Firefox WebExtension 中的后台脚本复制到剪贴板

    我正在将 Chrome 扩展程序移植到 Firefox 它具有粘贴到剪贴板的功能 但是 我还没有在 Firefox 中做到这一点 这是我在后台脚本中尝试执行的操作 const input document createElement tex
  • 为什么我的序言规则陷入无限递归

    我的代码可以达到其预期目的 但最后总是陷入循环 给出错误消息 超出堆栈限制 我的代码如下 byCar auckland hamilton byCar hamilton raglan byCar valmont saarbruecken by
  • Javascript 脚本在表单输入中查找乱码

    我需要一个脚本或正则表达式 我将使用 Javascript jQuery 来检查网站上的表单输入 来检查是否有人输入了大部分是乱码的单词 正常的单词或句子应该通过测试 This is a normal sentence pass Peter
  • 非详尽的模式匹配只是因为我省略了“否则=”? [复制]

    这个问题在这里已经有答案了 我用 Haskell 写了一个简单的程序来播放 The Rust 编程语言 一书中描述的猜谜游戏 它的工作原理如下 程序将生成一个 1 到 100 之间的随机整数 然后它会提示玩家输入猜测值 输入猜测后 会显示猜
  • 浏览器窗口之间是否可以进行基于事件的通信? [复制]

    这个问题在这里已经有答案了 是否可以有基于事件的浏览器选项卡 窗口之间的通信 我知道 至少理论上 可以使用本地存储 您能否提供执行此操作的代码的小示例 只需在一个选项卡中发送事件 然后在另一个选项卡中接收事件 有没有库 jquery 插件可
  • ActionController::未知格式

    在我的 Rails 应用程序中 我有一个向服务器发出的 ajax 请求 用于存储一些数据 这曾经工作没有任何问题 但现在我收到一个错误 ActionController UnknownFormat ActionController Unkn
  • Android RemoteViews ListView 滚动

    我正在尝试滚动ListView到某个特定位置AppWidget 然而它没有做任何事情 我也尝试过设置位置方法但不起作用 也没有错误或堆栈跟踪 Code if list size 0 loadLayout R layout rooster w
  • 从类unix系统获取唯一的id

    我想从任何类 Unix 系统 如果可能的话 获得一个唯一的 id 每次我的应用程序在同一台机器上运行时该 id 都会保持不变 如果可能的话 我想从Linux或FreeBSD或Solaris等获得相同的id 我不想为每台机器生成一个新的id
  • 使用 RxSwift 实现简单的可观察结构?

    我试图在 Swift 中提出一个简单的可观察对象并考虑使用RxSwift 我找不到一个简单的例子来做这样的事情 protocol PropertyObservable typealias PropertyType var propertyC