我想知道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的声明。
感谢您的任何评论和想法!
答案 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")