KVC
key-value coding。
- 是一种间接访问对象的机制。
- key的值就是属性名称的字符串,返回的value是任意类型,需要自己转化为需要的类型。
- KVC主要就是两个方法。
通过key设置对应的属性。
通过key设置对应的属性。
🌰
class KVCDemo:NSObject{
var data = "hello world"
}
var instance = KVCDemo()
var value = instance.value(forKey: "data") as! String
instance.setValue("hello hhy",forKey:"data")
print(instance.data)//
KVO
key-value observing。
- 建立在KVC之上的的机制。
- 主要功能是检测对象属性的变化。
- 这是一个完善的机制,不需要用户自己设计复杂的视察者模式。
- 对需要视察的属性要在前面加上dynamic关键字。
🌰
- 对要视察的对象的属性加上dynamic关键字。
class KVODemo:NSObject{
dynamic var demoDate = NSDate()
func updateDate(){
demoDate = NSDate()
}
}
声明一个全局的用来辨别是哪一个被视察属性的变量。
private var mycontext = 0
在要视察的类中
addObserver
,在析构中removeObserver
,重写observeValue
。
data.addObserver(self, forKeyPath: "demoDate", options: .new, context: &mycontext)
deinit {
data.removeObserver(self,forKeyPath:"demoDate")
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("\(context!)============\(mycontext)")
if(context == &mycontext) {
print("Changed to:(change[NSKeyValueChangeNewKey]!)")
}
}
@IBAction func button(_ sender: AnyObject) {
data.updateDate()
}
--
完整代码
import Foundation
class KVODemo:NSObject{
dynamic var demoDate = NSDate()
func updateDate(){
demoDate = NSDate()
}
}
import UIKit
private var mycontext = 0
class ViewController: UIViewController {
var data = KVODemo()
override func viewDidLoad() {
super.viewDidLoad()
//1.注册监听对象
data.addObserver(self, forKeyPath: "demoDate", options: .new, context: &mycontext)
//forKeyPath: "demoDate" - 需要监听的属性
//options: .new - 指返回的字典包含新值
//options: .old - 指返回的字典包含旧值。
//context: &mycontext -context方便传输你需要的数据,它是个指针类型
}
deinit {
data.removeObserver(self,forKeyPath:"demoDate")
}
//2. 实现监听方法
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("\(context!)============\(mycontext)")
if(context == &mycontext) {
print("Changed to:(change[NSKeyValueChangeNewKey]!)")
}
}
@IBAction func button(_ sender: AnyObject) {
data.updateDate()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}