Swift中的KVO

通知對象(觀察者oberver)其他對象(被觀察者observed)屬性的更改

概述Key-Value Observing是一種Cocoa編程模式,用于通知對象關(guān)于其他對象屬性的更改。它對于在應(yīng)用程序的邏輯分離部分之間(例如modelview之間)傳遞更改非常有用。只能對繼承自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實例的oldValuenewValue屬性來查看正在觀察的屬性發(fā)生了什么變化。
如果不需要知道屬性是如何更改的,請忽略options參數(shù)。省略options參數(shù)將放棄存儲新和舊屬性值,這將導(dǎo)致oldValuenewValue屬性為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()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容