什么是觀察者模式?

觀察者模式.png
觀察者模式是定義對象間的一種一對多的依賴關(guān)系,并且當(dāng)一個對象的狀態(tài)發(fā)生改變的時候,所有依賴于它的對象都會得到通知且自動更新。
iOS中實現(xiàn)觀察者模式有兩種方式:通知和KVO
- 先了解KVO
我所理解的是KVO,一個是觀察者,一個是被觀察者,當(dāng)然自己觀察自己也是可以的,就像自我反省一樣。觀察者對被觀察者的某個屬性感興趣,就把注意力放在這個屬性上,當(dāng)這個屬性發(fā)生變化時,觀察者就根據(jù)這個屬性變化作出相對應(yīng)的措施。至于什么措施,就因人而異啦??!
- 用一下吧
//用于觀察的屬性
@property (nonatomic, assign) NSInteger weekNum;//星期幾
//賦初始值
self.weekNum = 1;
//給自己添加觀察者,觀察自己的weekNum屬性
[self addObserver:self forKeyPath:@"weekNum" options:NSKeyValueObservingOptionNew context:nil];
NSKeyValueObservingOptionNew 通知中發(fā)送的更改字典包含新值
NSKeyValueObservingOptionOld 舊值
_weekNum 與 self.weekNum的區(qū)別
使用self.XXX 會調(diào)用set和get方法,而_XXX則直接訪問實例變量并賦值,不會調(diào)用set和get方法
KVO觀察屬性!其實是觀察set方法!!
- 改變值
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
self.weekNum++;
}
- 屬性變化調(diào)用
#pragma -mark ——————————監(jiān)聽值變化-——————————
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"weekNum"]) {
NSLog(@"%@",[object valueForKey:@"weekNum"]);
NSLog(@"--change:--%@", [change objectForKey:@"new"]);
//做對應(yīng)的操作
}
}
- 最后別忘了移除
- (void)dealloc
{
//移除觀察者
[self removeObserver:self forKeyPath:@"weekNum"];
}
添加觀察者前后類的變化
打印isa指針指向的類
NSLog(@"isa-> %@", object_getClass(self));
添加前 :isa-> YHObserverPracticeVC
添加后:isa-> NSKVONotifying_YHObserverPracticeVC
移除后:isa-> YHObserverPracticeVC
- 由此可見,觀察的時候,動態(tài)的生成一個前綴為NSKVONotifying_+類名的子類,觀察的是這個新生成類的set方法