如何在 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"
    


我正在尝试观察ForecastViewModelforecast 对象的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 内部创建它,并从initForecastViewModel 中的forecast 模型初始化它的值。然后在其.subscribe 回调中。更新预测模型中的值。

以上是关于如何在 RxSwift 中观察对象的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RxSwift 中使用 EventConvertible 创建客户观察者事件?

如何使用 RxSwift 观察 UITextField 中的文本变化?

RxSwift 将可观察对象数组与对象数组结合

iOS RxSwift - 如何“断开”一个 observable?

如何在 RxSwift 中观察 UITableView 点击/选择的先前值和当前值?

在 RxCocoa/RxSwift 中,如何观察 BehaviorRelay<[object]> 数组大小发生变化