KVO (Key - Value Observing)

鍵-值觀察者(key - value observing)是指當指定的對象的屬性被修改時,允許對象接收通知的機制。
總的來說,也就是告訴一個對象,“我想要觀察你的fido屬性,如果它發(fā)生了變化,就通知我。當setFido: 方法被調(diào)用的時候,被觀察的對象會發(fā)送消息告訴你,我的fido屬性有一個新值了。”討論KVO和討論NSNotificationCenter時使用的語言很相似,二者底層實現(xiàn)原理很相似。

觀察、回調(diào)

  1. 添加觀察
  • 無論lastTime何時發(fā)生變化,都要通知我它改變的新值以及改變之前的舊值
    [被觀察者 addObserver: 觀察者
    forKeyPath: @"被觀察者的某一屬性"
    options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
    context: nil];
    實現(xiàn)被觀察屬性發(fā)生變化時的回調(diào)方法
- (void)observeValueForKeyPath:(NSString *)keyPath
                         ofObject:(id)object
                           change:(NSDictionary *)cahnge
                               context:(void *)context {
    NSString *oldValue = [change objectForKey:NSKeyValueChangeOldKey];
        NSString *newValue = [change objectForKey:NSKeyValueChangeNewKey];
}
  1. 在KVO中使用context
    注意: 當在代碼中將某個對象注冊為觀察者時,你需要傳遞指針為context。當接收變化的通知時,context會隨通知一起發(fā)送。context可以用來回答:“這真的是我需要的通知嗎?”例:
static int contextForKVO;
[被觀察者 addObserver: self 
               forKeyPath: @"fido"
                options:0
                         context: &contextForKVO];
- (void)observeValueForKeyPath:(NSString *)keyPath
                         ofObject:(id)object
                           change:(NSDictionary *)cahnge
                               context:(void *)context {
    // 這是不是我的?
    if (context != &contextForKVO) {
        // 將它傳遞給父類
        [super observerValueForKeyPath:keyPath];
    } else {
        // 處理變化
    }
}
  1. 顯式觸發(fā)通知
    如果使用存取方法來設置屬性,那么系統(tǒng)就會自動通知觀察者。但由于某種原因,你選擇不適用存取方法呢?這時可以通過willChangeValueForKey:和didChangeValueKey:方法通知系統(tǒng)木某個屬性的值即將/已經(jīng)發(fā)生變化。
NSDate *now = [NSDate date];
[self willChangeValueForKey:@"lastTime"];
_lastTime = now;
[self didChangeValueForKye:@"lastTime"];
  1. 獨立的屬性
    如果你不想觀察_lastTime而想觀察_lastTimeString,可以通過一個類方法來做這項工作。
+ (NSSet *)keyPathsForValuesAffectingLastTimeString {
   retutn [NSSet setWithObject:@"lastTime"];
}

注:摘自《Objective-C編程》(第2版)page 301

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 或者KVO,是一個非正式協(xié)議,它定義了對象之間觀察和通知狀態(tài)改變的通用機制。 基本使用 使用KVO必須要滿足的條件...
    一枚iOS程序猿閱讀 819評論 0 0
  • KVO的定義 當指定的對象的屬性被修改時,允許對象接收通知的機制。觀察對象的屬性時,要指定觀察屬性的名稱,還有一些...
    Nevermind閱讀 315評論 0 0
  • 一 、 KVO 的概述 KVO 的全稱 " Key-Value Observing " KVO 是鍵值觀察機制,使...
    NetWork小賤閱讀 2,240評論 0 1
  • KVO的作用: 監(jiān)聽某個對象屬性值的改變 KVO的內(nèi)部實現(xiàn)原理: 1 KVO是基于運行時(runtime)來實現(xiàn)的...
    JaXz閱讀 296評論 0 2
  • :用于數(shù)據(jù)組件的狀態(tài)數(shù)據(jù)發(fā)生改變時,試圖組建能動態(tài)更新自己 iOS應用通常會把應用程序組建分開為 數(shù)據(jù)模型組件:負...
    nalis風閱讀 284評論 0 0

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