KVO - key value observer 鍵值
觀察web
監聽對象屬性變化
的一種手段,能夠用在開源框架,讓代碼解耦。例如:上拉、下拉刷新控件
面試
KVO 是同步的仍是異步的?框架
添加觀察異步
// 添加鍵值觀察/** 1. 調用對象:要監聽的對象 2. 參數 1> 觀察者,負責處理監聽事件的對象 2> 觀察的屬性 3> 觀察的選項 4> 上下文 */[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Person Name"];
監聽方法spa
// NSObject 分類方法,意味着全部的 NSObject 均可以實現這個方法!// 跟協議的方法很像,分類方法又能夠稱爲「隱式代理」!不提倡用,可是要知道概念!// 全部的 kvo 監聽到事件,都會調用此方法/** 1. 觀察的屬性 2. 觀察的對象 3. change 屬性變化字典(新/舊) 4. 上下文,與監聽的時候傳遞的一致 能夠利用上下文區分不一樣的監聽! */- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"睡會 %@", [NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; NSLog(@"%@ %@ %@ %@", keyPath, object, change, context); }
監聽方法執行會在屬性變化所在的線程上執行!線程
若是多個線程同時修改一個屬性,可能會出現資源搶奪的問題代理
若是監聽的屬性多,KVO 的監聽方法會很是難寫code
對象銷燬以前,必定要取消監聽server