首页 文章

KVO听众在Swift 4中发布

提问于
浏览
2

我正在使用 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 回答

  • 4

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

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

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

相关问题