Swift實現(xiàn)KVO的兩種方式

KVO 即 Key-Value Observing,翻譯成鍵值觀察。它是一種觀察者模式的衍生。其基本思想是,對目標(biāo)對象的某屬性添加觀察,當(dāng)該屬性發(fā)生變化時,通過觸發(fā)觀察者對象實現(xiàn)的KVO接口方法,來自動的通知觀察者。

簡單來說KVO可以通過監(jiān)聽key,來獲得value的變化,用來在對象之間監(jiān)聽狀態(tài)變化。KVO的定義都是對NSObject的擴展來實現(xiàn)的,Objective-C中有個顯式的NSKeyValueObserving類別名,所以對于所有繼承了NSObject的類型,都能使用KVO(一些純Swift類和結(jié)構(gòu)體是不支持KVC的,因為沒有繼承NSObject)。詳情可以參考:KVC/KVO詳解

創(chuàng)建一個被觀察的對象

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)

// 重寫響應(yīng)方法
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")
最后編輯于
?著作權(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)容