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)步。多多交流铲敛!