class People: NSObject {
var date = NSDate()
var interval : TimeInterval {
return date.timeIntervalSinceNow
}
}
class SubPerple: People {
dynamic override var date: NSDate {
get{
return super.date
}
set{
super.date = newValue
}
}
// 计算性属性,因为只有调用了这个属性,才能获取到它的变化,所以 KVO 没必要监听计算性属性
//
dynamic override var interval: TimeInterval {
return super.interval
}
}
people.addObserver(self, forKeyPath: "date", options: [.new, .old], context: nil)
people.addObserver(self, forKeyPath: "interval", options: [.new, .old], context: nil)
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let change = change,
let keyPath = keyPath {
print(keyPath)
if keyPath == "date"{
print(change[.newKey] ?? "--1")
print(change[.oldKey] ?? "--3")
} else {
print(change[.newKey] ?? "--11")
print(change[.oldKey] ?? "--33")
}
print(people.date)
print(people.interval)
}
}
// Swift 中的 KVO 仅限于在 NSObject 的子类中,因为 KVO是基于 KVC 以及动态派发技术实现的,而这些东西都是 OC 运行时的概念。 Swift 为了效率,默认禁用了动态派发,因此想用 Swift 来实现 KVO,我们还需要做额外的工作,那就是将想要观测的对象标记为 dynamic
// 通常需要监测的类没有办法修改,我们就需要新建一个它的子类,重写这个属性,上 dynamic 关键字
// 另外一点,KVO 需要监测的是存储性属性,因为存储性属性才会开辟内存空间,计算性属性只有调用属性的时候才会更改属性值,所以无需KVO
网友评论