SwiftiOS面试题相关知识点

Swift实现KVO的两种方式

2020-07-17  本文已影响0人  林夕copy

KVO 即 Key-Value Observing,翻译成键值观察。它是一种观察者模式的衍生。其基本思想是,对目标对象的某属性添加观察,当该属性发生变化时,通过触发观察者对象实现的KVO接口方法,来自动的通知观察者。

简单来说KVO可以通过监听key,来获得value的变化,用来在对象之间监听状态变化。KVO的定义都是对NSObject的扩展来实现的,Objective-C中有个显式的NSKeyValueObserving类别名,所以对于所有继承了NSObject的类型,都能使用KVO(一些纯Swift类和结构体是不支持KVC的,因为没有继承NSObject)。详情可以参考:KVC/KVO详解

创建一个被观察的对象

class ATKVOModel: NSObject {
   // dynamic需要的加上@objc
   @objc dynamic var name: String = ""
}

第一种方式:

var model = ATKVOModel()
// 添加观察者(self需要继承NSObjetc)
model.addObserver(self, forKeyPath: "name", options: [.new, .old], context: nil)

// 重写响应方法
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
   print(keyPath) // name
  if let old = change?[NSKeyValueChangeKey.oldKey] {
    print(old) // 
  }
        
  if let new = change?[NSKeyValueChangeKey.newKey] {
    print(new) // Albert
  }
}

// 修改model的值
model.name = "Albert"

第二种方法:

var model = ATKVOModel()
var observer: NSKeyValueObservation?

observer = model.observe(\ATKVOModel.name, options: [.old, .new]) { (model, change) in
  if let old = change.oldValue {
    print(old) //
  }
  if let new = change.newValue {
    print(new) // Albert
  }
}

// 修改model的值
model.name = "Albert"

最后别忘了删除观察者

model.removeObserver(self, forKeyPath: "name")
上一篇 下一篇

猜你喜欢

热点阅读