使用withLatestFrom

时间:2019-05-20 20:18:10

标签: ios rx-swift reactive

我想知道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 和可热观察的 myObservable 。我们还增加了 Timer.scheduledTimer ... 中的updatedValue的值。

这里的流程非常简单。订阅时,将调用observedValue,然后从observedValue中获取onNext,然后从Disposables.create()中获取onNext。然后我们在onNext(0)上打印事件。

myObservable 是基于 Observable.interval 的,因此与LatestFrom值相同,每秒都会在onNext上打印一次。

问题:每次myObservable发出新事件时,是否有一种方法可以打印updatedValue的最后一个值?因此,我们得到的是0,1,2 ...而不是0,0,0 ...

我知道可以将updatedValue声明为BehaviorRelay。 我也知道我们可以使用.map {}来捕获self.updatedValue。

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

感谢您的任何评论和想法!

2 个答案:

答案 0 :(得分:1)

  

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

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

由于您的财产是一种价值类型,因此即使没有涉及Rx,访问财产的唯一方法是通过自我。

答案 1 :(得分:1)

RxCocoa在KVO周围有一个方便的包装器。您应该可以从NSObject子类的.rx扩展名使用它。

对于您的问题,我想您可以执行以下操作:

let updatedValueObservable = self.rx.observe(Int.self, "updatedValue")