iOS開發(fā)--KVO觀察者模式

KVO觀察者模式

  • 先來了解下什么是KVO
    KVO :key value observing,是觀察者模式的一種
    1陌选、觀察者:是設(shè)計模式中的一種睡汹,提供一種機(jī)制肴甸,當(dāng)一個對象的屬性發(fā)生變化時,所有對該屬性感興趣的對象都會收到通知
    2囚巴、兩部分組成:觀察者和被觀察者原在,當(dāng)被觀察者的屬性發(fā)生變化,對其感興趣的觀察者都會得到通知
  • 下邊是代碼片段我會寫上注釋大家有什么問題我們可以討論的
// 這里的t和p是我創(chuàng)建的兩個對象彤叉,做了屬性聲明
 self.t = [[Target alloc]init];
  self.p = [[People alloc]init];
    //我們設(shè)置p對t的價格(price)感興趣庶柿,當(dāng)price發(fā)生變化的時候,p要收到通知
    //參數(shù):observer:觀察者 self.p
    //參數(shù)keyPath:觀察者感興趣的屬性 price秽浇,該值遵循kvc編碼浮庐,要跟t中的屬性的命名保持一致,price是對象t的成員
    //參數(shù)options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld新值和舊值都給觀察者也就是self.p
    //參數(shù)context:上下文柬焕,可以傳遞附加的信息
    [self.t addObserver:self.p forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
    
    //添加p對mArray的觀察 這個mArray也是t對象的成員之一审残,同上
    [self.t addObserver:self.p forKeyPath:@"mArray" options:NSKeyValueObservingOptionNew context:nil];
    // 這里的這個方法是在對象t內(nèi)部定義的一個方法
/*
這個是內(nèi)部的方法
 - (void)addObjectToArray:(NSString*)obj
{
    //數(shù)組內(nèi)容的變化不會自動觸發(fā)KVO,需要手動觸發(fā)KVO
    [self willChangeValueForKey:@"mArray"];
    [self.mArray addObject:obj];
    [self didChangeValueForKey:@"mArray"];
}
*/
    [self.t addObjectToArray:@"abc"];
    
    //修改price的值,使用setPrice方式會觸發(fā)KVO
    // self.t.price = @"5";
    //使用KVC的方式賦值斑举,也會觸發(fā)kvo
    //[self.t setValue:@"10" forKey:@"price"];
    [self.t changePrice];// 這個也是對象t內(nèi)部定義的方法
    //把self.p移除出去搅轿,以后price的變化就不會再通知到p
    [self.t removeObserver:self.p forKeyPath:@"price"];
    self.t.price = @"200";
  • 現(xiàn)在寫下在People類中在接收到變化時的操作,也就是上邊的p對象在接收到自己感興趣的變化時做出的反應(yīng),由于這個是系統(tǒng)方法富玷,只需要在.m文件中實現(xiàn)就好了
//當(dāng)自己感興趣的值發(fā)生變化時璧坟,該方法被系統(tǒng)自動調(diào)用
// keyPath:是自己感興趣的屬性(price)
//object:是哪個對象的屬性(Target對象)
//change:字典:包含變化前后的值
//context:環(huán)境上下文没宾,附加信息,跟添加觀察者對應(yīng)
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    if([keyPath isEqualToString:@"price"])
    {
        NSString *newValue = [change objectForKey:NSKeyValueChangeNewKey];
        NSString *oldValue = [change objectForKey:NSKeyValueChangeOldKey];
// 如果是價格變動做出操作
    }if ([keyPath isEqualToString:@"mArray"]) {
// 如果是數(shù)組變動做出操作
        Target *t = (Target*)object;
        NSMutableArray *array = [change objectForKey:NSKeyValueChangeNewKey];
    }
    else{
        //不是自己感興趣的交給父類處理
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

接下來我會整理下KVC模式的筆記
歡迎大家指正沸柔,共同進(jìn)步。多多交流铲敛!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褐澎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伐蒋,更是在濱河造成了極大的恐慌工三,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件先鱼,死亡現(xiàn)場離奇詭異俭正,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)焙畔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門掸读,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宏多,你說我怎么就攤上這事儿惫。” “怎么了伸但?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵肾请,是天一觀的道長。 經(jīng)常有香客問我更胖,道長铛铁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任却妨,我火速辦了婚禮饵逐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘管呵。我一直安慰自己梳毙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布捐下。 她就那樣靜靜地躺著账锹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坷襟。 梳的紋絲不亂的頭發(fā)上奸柬,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音婴程,去河邊找鬼廓奕。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桌粉。 我是一名探鬼主播蒸绩,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铃肯!你這毒婦竟也來了患亿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤押逼,失蹤者是張志新(化名)和其女友劉穎步藕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挑格,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡咙冗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了漂彤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雾消。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖显歧,靈堂內(nèi)的尸體忽然破棺而出仪或,到底是詐尸還是另有隱情,我是刑警寧澤士骤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布范删,位于F島的核電站,受9級特大地震影響拷肌,放射性物質(zhì)發(fā)生泄漏到旦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一巨缘、第九天 我趴在偏房一處隱蔽的房頂上張望添忘。 院中可真熱鬧,春花似錦若锁、人聲如沸搁骑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仲器。三九已至,卻和暖如春仰冠,著一層夾襖步出監(jiān)牢的瞬間乏冀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工洋只, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留辆沦,地道東北人昼捍。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像肢扯,于是被迫代替她去往敵國和親妒茬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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