Swift中的KVO

2017-02-04  本文已影响40人  fordring2008

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

上一篇 下一篇

猜你喜欢

热点阅读