Swift中的KVO

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容