美文网首页
Swift中的KVO

Swift中的KVO

作者: fordring2008 | 来源:发表于2017-02-04 10:25 被阅读40次

    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

    相关文章

      网友评论

          本文标题:Swift中的KVO

          本文链接:https://www.haomeiwen.com/subject/emyjittx.html