【问题标题】:How to observe object's property in RxSwift?如何在 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 块每次都被调用。

我应该如何观察这个类的属性?

【问题讨论】:

    标签: swift rx-swift


    【解决方案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 回调中。更新预测模型中的值。
    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多