ios - 使用 withLatestFrom 收集存储的变量属性
问题描述
我想知道 RxSwift 中是否有办法观察存储的变量属性的值。例如。在以下示例中:
var updatedValue: Int = 0
var observedValue: Observable<Int> {
return Observable.create({ (observer) -> Disposable in
observer.onNext(updatedValue)
return Disposables.create()
})
}
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
updatedValue = updatedValue + 1;
}
let myObservable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.publish()
myObservable.connect()
myObservable
.withLatestFrom(observedValue)
.subscribe { (event) in
print(event)
}
我们有变量属性updatedValue和 hot observable myObservable。我们还在Timer.scheduledTimer...中增加 updatedValue 的值。
这里的流程非常简单。当我们订阅时,observedValue 被调用,我们从observedValue 中获得onNext,然后是Disposables.create()。然后我们打印事件 onNext(0)。
由于myObservable是基于Observable.interval的,因此与LatestFrom 相同的值每秒都会打印在 onNext 中。
问题:有没有办法在 myObservable 每次发出新事件时打印 updatedValue 的最后一个值?所以不是 0,0,0... 我们得到 0,1,2...
我知道 updatedValue 可以声明为 BehaviorRelay。我也知道我们可以使用 .map { } 来捕获 self.updatedValue。
但是我想知道是否有任何方法可以围绕标准变量属性创建一个 Observable 包装器,以便每次触发序列发送事件时它都会使用最新值调用 onNext?无需捕获自我或更改 updatedValue 上的声明。
感谢您的任何意见和想法!
解决方案
但是我想知道是否有任何方法可以围绕标准变量属性创建一个 Observable 包装器,以便每次触发序列发送事件时它都会使用最新值调用 onNext?无需捕获自我或更改 updatedValue 上的声明。
正确答案是,不。updatedValue
如果不涉及自我,就没有办法做任何事情。一种方法是使用Observable<Int>.interval(1, scheduler: MainScheduler.instance).compactMap { [weak self] _ in self?.updatedValue }.distinctUntilChanged()
(您对发布和连接的使用是奇怪且不必要的,)但这涉及 self.
由于您的属性是一种值类型,因此访问它的唯一方法是通过 self,即使根本不涉及 Rx。
推荐阅读
- ios - 如果日期缺失,则根据日期在折线图中绘制值,而不是在折线图中绘制(danielgindi / Charts)
- wordpress - 如何在wordpress / elementor中更改不同按钮点击的图像
- php - 自定义 Laravel 默认验证电子邮件(更改标题)
- ios - 如何在 iOS Swift 中模拟 Firebase RemoteConfig 以进行测试?
- python - 基于 Keras 中的分割图有选择地应用卷积
- python - keras:评估多类 CNN 的 ROC AUC
- ruby-on-rails - Capybara 测试是否看到一个字段,但两个字段具有相同的开头,这会导致问题
- c++ - cmake找不到源文件tensorrt
- mongodb - 从 RabbitMQ 接收后保存到 mongoDB
- date - 日期字段 计算值 上个月的最后一天