知识来源:https://www.jianshu.com/p/712efd0b4457
观察者模式是为了解决什么问题的呢?
观察者模式的定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 简而言之,就是A和B,A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化。这个也叫做经典观察者模式。
在iOS中通过什么方案来解决的呢?
在iOS中观察者模式的实现有两种方法:Notification、KVO。
当前体系下的具体实现方案呢?
一、Notification
1、对于感兴趣的A来说,在这里定义通知,也就是注册观察者(A就是观察者,怎么观察的以及观察到了会做些什么)
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(notice:) name:@"tongzhi"object:nil];
-(void)notice:(id)sender{NSLog(@"%@",sender);}
2、对于变化源B来说,在B这里发出通知
//创建通知对象NSNotification*notification =[NSNotificationnotificationWithName:@"tongzhi"object:nil];
//Name是通知的名称 object是通知的发布者(是谁要发布通知,也就是对象) userInfo是一些额外的信息(通知发布者传递给通知接收者的信息内容,字典格式)//
[NSNotification notificationWithName:@"tongzhi" object:nil userInfo:nil];//发送通知[[NSNotificationCenterdefaultCenter] postNotification:notification];
3、当然了,还要移除观察者,在dealloc里面
- (void)dealloc {
//删除根据name和对象,如果object对象设置为nil,则删除所有叫name的,否则便删除对应的[[NSNotificationCenterdefaultCenter] removeObserver:selfname:@"tongzhi"object:nil];
}
二、KVO
KVO全称叫Key Value Observing,顾名思义就是一种观察者模式用于监听属性的变化,KVO和NSNotification有很多相似的地方,用addObserver:forKeyPath:options:context方法 去观察,用removeObserver:forKeyPath:context去移除观察者,用observeValueForKeyPath:ofObject:change:context:去响应观察者,KVO是监控自身属性的变化,如uilabel对象的,他监控自身的属性,比如可以有text等