KVO的簡單瞭解與使用

簡介

KVO(鍵值監聽),即 Key-Value Observing, 是Objective-C 對觀察者設計模式的一種實現。它提供一種機制,當指定的對象的屬性被修改後(執行了setter 或 KVC 賦值),對象就會接受到通知。html

應用

當某個對象的某個屬性值改變時,用KVO監聽。設計模式

QQ.png

QQ.png

示例

一、模型建立 在.h中數組

@interface PDcar : NSObject
@property (nonatomic,assign) int num;    // 屬性
@end
複製代碼

二、在 VC 中監聽並響應屬性改變markdown

@interface ViewController ()

@property (nonatomic,strong)PDcar *myCar;    //聲明瞭car屬性

@end
複製代碼
- (void)viewDidLoad { 
[super viewDidLoad]; 

self.myCar = [[PDcar alloc] init]; 

//設置監聽
[self.myCar addObserver:self forKeyPath:@"num" options:
NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
}
複製代碼

三、實現監聽回調方法oop

// 只要object的keyPath屬性發生變化,就會調用此方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary<NSString *,id> *)change context:(void *)context{

// 判斷是否爲self.myCar的屬性「num」:
if([keyPath isEqualToString:@"num"] && object == self.myCar) { 
    // 響應變化處理
    self.label.text = [NSString stringWithFormat:@"當前的num值爲:%@",
[change valueForKey:@"new"]]; 

    //change的使用:上文註冊時,枚舉爲2個,所以能夠提取change字典中的新、舊值的這兩個方法 
    NSLog(@"oldnum:%@ ----newnum:%@",[change valueForKey:@"old"],
    [change valueForKey:@"new"]); 
  }
}
複製代碼

四、註銷監聽atom

-(void)dealloc{
    // 移除KVO 
    [self removeObserver:self forKeyPath:@"num" context:nil];
}
複製代碼

注意!同一個屬性不能重複removeObserver,不然會出問題。spa

監聽數組

www.cnblogs.com/XYQ-208910/…設計

與Notification(通知)、代理的區別

  • notification 比 KVO 多了發送通知的一步。

二者都是一對多,可是對象之間直接的交互,notification 明顯得多,須要notificationCenter 來作爲中間交互。而 KVO 如咱們介紹的,設置觀察者->處理屬性變化,至於中間通知這一環,則隱祕多了,只留一句「交由系統通知」,具體的可參照以上實現過程的剖析。代理

notification 的優勢是,監聽不侷限於屬性的變化,還能夠對多種多樣的狀態變化進行監聽,監聽範圍廣,例如鍵盤、先後臺等系統通知的使用也更顯靈活方便。code

  • 和 delegate 同樣,KVO 和 NSNotification 的做用都是類與類之間的通訊。可是與 delegate 不一樣的是:

這兩個都是負責發送接收通知,剩下的事情由系統處理,因此不用返回值;而 delegate 則須要通訊的對象經過變量(代理)聯繫; delegate 通常是一對一,而這兩個能夠一對多。

  • 另外須要注意的是,因爲KVO方式的注入是在運行時而不是編譯時實現的,若是給定的實例沒有觀察者,那麼 KVO 不會有任何開銷,由於此時根本就沒有 KVO 代碼存在。可是即便沒有觀察者,委託和 NSNotification 仍是得工做,這也是KVO此處零開銷觀察的優點。
相關文章
相關標籤/搜索