KVO(Key-Value-Observer)的基本概念和用法

KVO(Key-Value-Observer)的基本概念和用法

1、基本概念

   一種使對象獲取其他獨享的特定屬性變化的通知機制

2、適用情況

   主要用于試圖,交互方面,比如界面的某些數據變化了,界面的顯示也需要跟著變化,就需要建立數據和界面的關聯

3、實現步驟

   1)采用下面這個方法給屬性添加觀察者,在哪里注冊觀察者就要在哪里移除觀察者

       - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;

   2)觀察者實現下面方法,如果監聽的屬性發生變化,便會調用該方法。

       - (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSString*, id> *)change context:(nullable void *)context;

   3)個人習慣在delloc中釋放

       - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(nullable void *)context;

 
   4)下面是在一個程序里面的例子,幫大家理清思路

- (void)watchDog:(Dog *)dog{

   _dog = dog;


/*
 
 * _dog:指定觀察哪個對象
 
 * self: 誰觀察dog
 
 * face: 指定觀察dog對象的哪個屬性
 
 * OptionNew | OptionOld:當屬性變化時,將新值和舊值都傳給方法
 
 * context: 參數
 */

//1.讓主人監聽狗的表情
[_dog addObserver:self forKeyPath:@"face" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

 //2.讓主人監聽狗的動作
[_dog addObserver:self forKeyPath:@"action" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
 }

//如果監聽的屬性發生變化,便會調用該方法。
- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSString*, id> *)change context:(nullable void *)context{

if([keyPath isEqualToString:@"face"])
{
    if ([change[@"new"] isEqualToString:@"smaile"]) {
        
        NSLog(@"狗由%@變化為%@",change[@"old"],change[@"new"]);
        NSLog(@"給一塊肉");
    }
  }else if ([keyPath isEqualToString:@"action"]){
    
    if ([change[@"new"] isEqualToString:@"汪汪汪"]) {
        
        NSLog(@"狗由%@變化為%@",change[@"old"],change[@"new"]);
         NSLog(@"打一頓");
    }
}
   }
     
//當主人對象被釋放后移除觀察著
- (void)dealloc{

[_dog removeObserver:self forKeyPath:@"face"];
[_dog removeObserver:self forKeyPath:@"action"]; 

}
@end

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容