Swift 4 中的 KVO 侦听器问题
KVO listener issues in Swift 4
我正在使用 ViewModel
class 并希望在 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
变量的任何变化,但它没有得到回调。我在这里做错了什么?
.observe(_:options:changeHandler:)
函数returns一个NSKeyValueObservation
对象,用于控制观察的生命周期。当它被deinited或invalidated时,观察将停止。
由于您的视图控制器没有保留对返回的 "observation" 的引用,它在 viewDidLoad
结束时超出范围,因此停止观察。
要在视图控制器的生命周期内继续观察,请将返回的观察结果存储在 属性 中。如果您在此之前进行 "done" 观察,您可以在观察中调用 invalidate
或将 属性 设置为 nil
。
我正在使用 ViewModel
class 并希望在 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
变量的任何变化,但它没有得到回调。我在这里做错了什么?
.observe(_:options:changeHandler:)
函数returns一个NSKeyValueObservation
对象,用于控制观察的生命周期。当它被deinited或invalidated时,观察将停止。
由于您的视图控制器没有保留对返回的 "observation" 的引用,它在 viewDidLoad
结束时超出范围,因此停止观察。
要在视图控制器的生命周期内继续观察,请将返回的观察结果存储在 属性 中。如果您在此之前进行 "done" 观察,您可以在观察中调用 invalidate
或将 属性 设置为 nil
。