iOS的消息傳遞方式-4.KVO

1.1 KVO的定義

KVO(Key-Value Observing)搪哪,俗稱鍵值監(jiān)聽。它提供一種機制狠半,當指定的對象的屬性被修改后噩死,則對象就會接受到通知颤难。簡單的說就是每次指定的被觀察的對象的屬性被修改后,KVO就會自動通知相應(yīng)的觀察者了已维。

1.2 KVO的使用

KVO的定義KVO是“觀察者”設(shè)計模式的一種應(yīng)用,利用它可以很容易實現(xiàn)視圖組件和數(shù)據(jù)模型的分離行嗤,當數(shù)據(jù)模型的屬性值改變之后作為監(jiān)聽器的視圖組件就會被激發(fā),激發(fā)時就會回調(diào)監(jiān)聽器自身垛耳。這種模式有利于兩個類間的解耦合栅屏,尤其是對于業(yè)務(wù)邏輯與視圖控制 這兩個功能的解耦合。和KVC類似,在ObjC中要實現(xiàn)KVO則必須實現(xiàn)NSKeyValueObServing協(xié)議堂鲜,但不用擔心,因為NSObject已經(jīng)實現(xiàn)了該協(xié)議栈雳,因此幾乎所有的ObjC對象都可以使用KVO.

1.3KVO常用的方法

1>注冊指定Key路徑的監(jiān)聽器

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
相關(guān)參數(shù):
observer:觀察者,也就是KVO通知的訂閱者。訂閱著必須實現(xiàn)
observeValueForKeyPath:ofObject:change:context:方法
keyPath:描述將要觀察的屬性缔莲,相對于被觀察者哥纫。 
options:KVO的一些屬性配置;有四個選項痴奏。 
   options所包括的內(nèi)容:
   NSKeyValueObservingOptionNew:  change字典包括改變后的值 
   NSKeyValueObservingOptionOld:   change字典包括改變前的值 
   NSKeyValueObservingOptionInitial:注冊后立刻觸發(fā)KVO通知 
   NSKeyValueObservingOptionPrior:值改變前是否也要通知(這個key決定了是否在改變前改變后通知兩次)
context: 上下文蛀骇,這個會傳遞到訂閱著的函數(shù)中,用來區(qū)分消息读拆,所以應(yīng)當是不同的擅憔。
注意:不要忘記解除注冊,否則會導(dǎo)致資源泄露

2>刪除指定Key路徑的監(jiān)聽器:

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

3>回調(diào)監(jiān)聽

  - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
  keyPath:被監(jiān)聽的keyPath , 用來區(qū)分不同的KVO監(jiān)聽檐晕。 
  object: 被觀察修改后的對象(可以通過object獲得修改后的值) 
  change:保存信息改變的字典(可能有舊的值暑诸,新的值等) 
  context:上下文,用來區(qū)分不同的KVO監(jiān)聽
KVO的使用步驟也比較簡單
 1>注冊辟灰,指定被觀察者的屬性
 2> 實現(xiàn)回調(diào)方法
 3>移除觀察
1.4 KVO的使用場景
@interface StockData : NSObject {  
    NSString * stockName;  
    float price;  
}  
@end  
@implementation StockData  
@end
- (void)viewDidLoad  
{  
    [super viewDidLoad];  
  
    stockForKVO = [[StockData alloc] init];  
    [stockForKVO setValue:@"searph" forKey:@"stockName"];  
    [stockForKVO setValue:@"10.0" forKey:@"price"];      
    [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];  
  
    myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];  
    myLabel.textColor = [UIColor redColor];  
    myLabel.text = [stockForKVO valueForKey:@"price"];  
    [self.view addSubview:myLabel];  
     
    UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
    b.frame = CGRectMake(0, 0, 100, 30);  
    [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];  
    [self.view addSubview:b];  
  
}
-(void) buttonAction  
{  
    [stockForKVO setValue:@"20.0" forKey:@"price"];  
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  
{  
    if([keyPath isEqualToString:@"price"])  
    {  
        myLabel.text = [stockForKVO valueForKey:@"price"];  
    }  
}
- (void)dealloc  
{  
    [stockForKVO removeObserver:self forKeyPath:@"price"];  
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末个榕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芥喇,更是在濱河造成了極大的恐慌笛洛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乃坤,死亡現(xiàn)場離奇詭異,居然都是意外死亡沟蔑,警方通過查閱死者的電腦和手機湿诊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘦材,“玉大人厅须,你說我怎么就攤上這事∈匙兀” “怎么了朗和?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵错沽,是天一觀的道長。 經(jīng)常有香客問我眶拉,道長千埃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任忆植,我火速辦了婚禮放可,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朝刊。我一直安慰自己耀里,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布拾氓。 她就那樣靜靜地躺著冯挎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咙鞍。 梳的紋絲不亂的頭發(fā)上房官,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音奶陈,去河邊找鬼易阳。 笑死,一個胖子當著我的面吹牛吃粒,可吹牛的內(nèi)容都是我干的潦俺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼徐勃,長吁一口氣:“原來是場噩夢啊……” “哼事示!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起僻肖,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤肖爵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后臀脏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劝堪,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年揉稚,在試婚紗的時候發(fā)現(xiàn)自己被綠了秒啦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡搀玖,死狀恐怖余境,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤芳来,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布含末,位于F島的核電站,受9級特大地震影響即舌,放射性物質(zhì)發(fā)生泄漏佣盒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一侥涵、第九天 我趴在偏房一處隱蔽的房頂上張望沼撕。 院中可真熱鬧,春花似錦芜飘、人聲如沸务豺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笼沥。三九已至,卻和暖如春娶牌,著一層夾襖步出監(jiān)牢的瞬間奔浅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工诗良, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汹桦,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓鉴裹,卻偏偏與公主長得像舞骆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子径荔,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,131評論 30 470
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉督禽,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評論 0 9
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件总处、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • Easy 一道Easy的dp題狈惫,dp題如果簡單能用O(1) space的時候就盡量優(yōu)化。
    greatseniorsde閱讀 139評論 0 0
  • 本文結(jié)構(gòu): 1、為什么選擇去看武俠小說荸频? 2第岖、作者筆下的楚留香是一個什么樣的人? 3试溯、我的感受? 本文閱讀花時2分...
    morling嵐閱讀 1,266評論 3 1