一開始學Objective-C的時候聽過KVO、KVC模式,但是因為還有NSNotificationCenter和代理等等已經能實現我當時的需求,所以連KVO是什麼的縮寫都沒有查就跳過了…最近特地挪出一部分的時間來繼續加強iOS開發能力,今天的部分就是研究Block回調方法和KVO的基本用法。
KVO模式,當監聽的變量發生變化時做出行動
我每天都會安排一點點時間用在繼續學習上面,前兩天看到一個創業項目叫做Code4Startup,一位31歲的爸爸,白天上班工作,晚上創業。這個網站是用視頻code給你看,怎麼在短時間利用現有的資源去建立一個看起來很專業的網站。其中一個項目就介紹了用firebase+AngularJS創建一個線上web應用的例子(線上接案系統),可以看看。
我過了一遍code4Startup裡面的兩個項目,其中AngularJS有的那個功能超厲害,當我和你同時在那個網站上操作的時候,如果我發了一個任務,你那邊就會馬上刷新,你一留言,我這裏也馬上刷新,這就是AngularJS一開始出名的功能吧,好像叫做變量的雙向綁定。
KVO也就是這個功能,你可以監聽某個變量是不是有變化,當變化的時候可以做出相應的動作。
舉一個例子,有些APP會支持修改skin的功能,就是設定某種模板樣式,讓所有的按鈕、tableView等等變成可愛版、華麗版等等,也可以用到這個功能,不過可能NSNotificationCenter更好用?
KVO的簡單實現
我這裏創建一個叫做Student的類別繼承NSObject(就是要建立一個Model),Student有一個變量叫做age。
然後創建一個ViewController 上面有2個TextField用於顯示東西、2個Button用於操作Student數據
Student方面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
- (Student *)init{ if(self =[super init]){ self.age = 0; } return self; } - (void)plusAge{ self.age += 1; } - (void)clearAge{ self.age = 0; } |
ViewController方面
下面第一個函數的意思是為student增加一個監控者為self,監控的是student中的age屬性,當屬性值發生變化時會調用第二個函數,而contet就是為了區別調用對象的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//添加檢測 - (void)addObservation{ [_student addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:@"text1"]; [_student addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:@"text2"]; } //發現數值變化時 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ NSLog(@"did"); if(context == @"text1"){ _textField1.text = [NSString stringWithFormat:@" 年齡:%ld",_student.age]; }else if(context == @"text2"){ _textField2.text = [NSString stringWithFormat:@"雙倍年齡:%ld",_student.age*2]; } } |
當使用_property時,KVO會沒有反應了
一開始我習慣用_property而不是用self.property,而這個時候KVO就會失效。
1 2 3 |
- (void)plusAge{ _age += 1; } |
感謝你說明這麼淺顯易懂的例子,我跟你一樣一開始也是覺得有其它方式就能達到目的,趁著颱風假期間播空了解博大精深的Communication Patterns。
我有寫篇文章引用你這篇文章喔~ :D
我也很感謝你,因為你寫了不少讓我受益匪淺的文章XD
呵~你是說之前有找過我的部落格嗎?
對啊~還蠻常google到的XD