通知對象(觀察者oberver)其他對象(被觀察者observed)屬性的更改
概述:Key-Value Observing是一種Cocoa編程模式,用于通知對象關(guān)于其他對象屬性的更改。它對于在應(yīng)用程序的邏輯分離部分之間(例如model和view之間)傳遞更改非常有用。只能對繼承自NSObject的類使用鍵值觀察。
1.為你想要通過KVO觀察的屬性標(biāo)記為@objc屬性和dynamic動態(tài)修飾符。
class MyObjectToObserve: NSObject {
@objc dynamic var myDate = NSDate(timeIntervalSince1970: 0)
func updateDate() {
myDate = myDate.addingTimeInterval(Double(2<<30))
}
}
2.定義一個觀察者observer,一個observer類的實例會管理一個或多個屬性所做更改的信息,當(dāng)您創(chuàng)建一個觀察者時,您通過調(diào)用observe(_:options:changeHandler:)方法開始觀察,該方法帶有一個引用您想要觀察的屬性的keyPath。
class MyObserver: NSObject {
@objc var objectToObserver: MyObjectToObserve
var observation: NSKeyValueObservation?
init(object: MyObjectToObserve) {
objectToObserver = object
super.init()
observation = observe(\.objectToObserver.myDate, options: [.old, .new], changeHandler: { (object, change) in
print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)")
})
}
}
使用NSKeyValueObservedChange實例的oldValue和newValue屬性來查看正在觀察的屬性發(fā)生了什么變化。
如果不需要知道屬性是如何更改的,請忽略options參數(shù)。省略options參數(shù)將放棄存儲新和舊屬性值,這將導(dǎo)致oldValue和newValue屬性為nil。
3.將觀察者和觀察的屬性進行關(guān)聯(lián),通過將對象傳遞給觀察者的初始化器,你可以將你想要觀察的屬性與其觀察者關(guān)聯(lián)起來:
let observed = MyObjectToObserve()//被觀察者
let observer = MyObserver(object: observed)//觀察者
4.響應(yīng)屬性更改。被設(shè)置為使用KVO的對象(如上面的observe)通知其觀察者屬性更改。下面的示例通過調(diào)用updateDate方法更改myDate屬性。這個方法調(diào)用會自動觸發(fā)觀察者的變更處理程序:
observed.updateDate()