swift - KVO - 未调用observe() changeHandler
问题描述
我要实现的是ViewController
观察Model
' 属性。
但是,observe()
不会调用 changeHandler 方法。
我该如何解决?
ViewController.swift
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Model.sharedInstance.observe(\.dataSource, options: .new) { (dataSource, change) in
print("updated! ", dataSource, change) // not called...
}
Timer.scheduledTimer(timeInterval: 2.0, target: Model.sharedInstance, selector: #selector(Model.update), userInfo: nil, repeats: true)
}
}
模型.swift
class Model: NSObject {
@objc dynamic var dataSource = [Dictionary<String, Any>]()
class var sharedInstance: Model {
struct Singleton {
static let instance: Model = Model()
}
return Singleton.instance
}
@objc func update() {
dataSource.append(["key": "value"])
}
}
解决方案
你需要对观察有强烈的参考
class ViewController: UIViewController {
var ob:NSKeyValueObservation! /// the key item
override func viewDidLoad() {
super.viewDidLoad()
ob = Model.sharedInstance.observe(\.dataSource, options: .new) { (dataSource, change) in
print("updated! ", dataSource, change) // not called...
}
Timer.scheduledTimer(timeInterval: 2.0, target: Model.sharedInstance, selector: #selector(Model.update), userInfo: nil, repeats: true)
}
}
class Model: NSObject {
@objc dynamic var dataSource = [Dictionary<String, Any>]()
class var sharedInstance: Model {
struct Singleton {
static let instance: Model = Model()
}
return Singleton.instance
}
@objc func update() {
dataSource.append(["key": "value"])
}
}
模型也很简单
class Model: NSObject {
@objc dynamic var dataSource = [[String:Any]]()
static let sharedInstance = Model()
@objc func update() {
dataSource.append(["key": "value"])
}
}
推荐阅读
- tensorflow - 带有 TensorFlow 2.1 的 Cloud TPU v3 Pod 的 TPUClusterResolver 出错
- sockets - 如何在数据链路层(以太网)监听并在传输层响应
- virtualenv - 尝试在 Windows 10 上使用 cmd 设置虚拟环境时出现此错误
- python - 将包含名字和姓氏列表的两列合并为一个包含全名列表的列
- c++ - c++中从double到string的转换
- python - Numpy:基于列中的匹配连接/扩展二维数组。如何消除for循环?
- python - 无法使用 Pytorch 从谷歌 AI 平台获取预测
- ios - 无法为 iOS xCode 项目安装 Firebase
- go - 谷歌云函数默认环境变量未设置
- c# - 创建实体时的表名(包含/正则表达式) - 实体框架 - 表前缀