首页 > 解决方案 > 使用 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 上的声明。

感谢您的任何意见和想法!

标签: iosrx-swiftreactive

解决方案


但是我想知道是否有任何方法可以围绕标准变量属性创建一个 Observable 包装器,以便每次触发序列发送事件时它都会使用最新值调用 onNext?无需捕获自我或更改 updatedValue 上的声明。

正确答案是,不。updatedValue如果不涉及自我,就没有办法做任何事情。一种方法是使用Observable<Int>.interval(1, scheduler: MainScheduler.instance).compactMap { [weak self] _ in self?.updatedValue }.distinctUntilChanged()(您对发布和连接的使用是奇怪且不必要的,)但这涉及 self.

由于您的属性是一种值类型,因此访问它的唯一方法是通过 self,即使根本不涉及 Rx。


推荐阅读