KVO监听器在Swift 4中发布

时间:2018-05-05 07:38:59

标签: swift swift4 key-value-observing nsobject

我正在使用ViewModel类,如果对loginResponse变量进行任何更改,则需要设置观察者。

@objcMembers class ViewModel: NSObject {

    var count = 300
    @objc dynamic var loginResponse :String

    override init() {
        loginResponse = "1"
        super.init()
        setupTimer()
    }

    func setupTimer(){
        _ = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector:#selector(callTimer), userInfo: nil, repeats: true)
    }

    func callTimer(){
        let minutes = String(count / 60)
        let seconds = String(count % 60)
        loginResponse = minutes + ":" + seconds
        count =  count - 1
    }
}

查看控制器代码:

override func viewDidLoad() {
    super.viewDidLoad()

    _ = viewModel.observe(\ViewModel.loginResponse) { (model, changes) in
        print(changes)
    }
}

我想在我的Viewcontroller中听取对loginResponse变量的任何更改,但它没有得到回调。我在这里做错了什么?

1 个答案:

答案 0 :(得分:5)

.observe(_:options:changeHandler:)函数返回一个NSKeyValueObservation对象,用于控制观察的生命周期。当它被去除或无效时,观察将停止。

由于您的视图控制器没有保留对返回的“观察”的引用,因此它会在viewDidLoad的末尾超出范围,从而停止观察。

要继续观察视图控制器的生命周期,请将返回的观察结果存储在属性中。如果您在此之前“完成”观察,则可以在观察中调用invalidate或将属性设置为nil