如何在 RxSwift 中观察对象的属性?
Posted
技术标签:
【中文标题】如何在 RxSwift 中观察对象的属性?【英文标题】:How to observe object's property in RxSwift? 【发布时间】:2018-06-23 19:08:39 【问题描述】:我有以下Forecast
类:
class Forecast
let city: City
var currentTemperature: String
didSet
print("cur tepm was set to \(currentTemperature)")
init(city: City)
self.city = city
self.currentTemperature = "0"
func loadForecast()
self.currentTemperature = "+10"
我正在尝试观察ForecastViewModel
中forecast
对象的currentTemperature
属性
class ForecastViewModel
fileprivate let variableForecast: Variable<Forecast>
var navigationTitle: Observable<String>
return Observable.just("No name")
init(forecast aForecast: Forecast)
self.variableForecast = Variable(aForecast)
self.variableForecast.asObservable().subscribe(onNext: (s) in
print(s.currentTemperature)
)
variableForecast.value.currentTemperature = "-15"
variableForecast.value.loadForecast()
然而,subscribe on next 中的代码只执行一次并打印 0。didSet
块每次都被调用。
我应该如何观察这个类的属性?
【问题讨论】:
【参考方案1】:其实你应该将currentTemperature
声明为Variable
来观察值的变化。你的Forecast
会变成这样
class Forecast
let city: City
var currentTemperature: Variable<String> = Variable("0")
init(city: City)
self.city = city
func loadForecast()
self.currentTemperature.value = "+10"
所以现在你可以订阅收听currentTemperature
的变化如下,
class ForecastViewModel
fileprivate let variableForecast: Variable<Forecast>
var navigationTitle: Observable<String>
return Observable.just("No name")
init(forecast aForecast: Forecast)
self.variableForecast = Variable(aForecast)
self.variableForecast.value.currentTemperature.asObservable().subscribe(onNext: (value) in
print(value)
)
variableForecast.value.currentTemperature.value = "-15"
variableForecast.value.loadForecast()
【讨论】:
是否可以在不将其声明为变量的情况下做到这一点?我想有一个独立于 rx 代码的模型类 我不这么认为。一种方法是在ForecastViewModel
内部创建它,并从init
的ForecastViewModel
中的forecast
模型初始化它的值。然后在其.subscribe
回调中。更新预测模型中的值。以上是关于如何在 RxSwift 中观察对象的属性?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 RxSwift 中使用 EventConvertible 创建客户观察者事件?
如何使用 RxSwift 观察 UITextField 中的文本变化?
iOS RxSwift - 如何“断开”一个 observable?