观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变;或者一个对象必须通知其它对象,而它又不能假定其它对象是谁,换言之,我们不希望这些对象是紧密耦合的。这时我们就可以利用到观察者模式。
- 在IOS中典型的推模型实现方式为NSNotificationCenter和KVO。
NSNotificationCenter
- 观察者Observer
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notice:) name:@"tongzhi" object:nil];
-(void)notice:(id)sender{
NSLog(@"%@",sender);
}
注意点:通知中心不会对观察者进行引用计数+1的操作,因此我们在观察者对象释放前,一定要在合适时机注销注册。否则通知中心任会向已释放的观察者发送通知,可能导致程序崩溃
- 发出通知
//创建通知对象
NSNotification *notification = [NSNotification notificationWithName:@"123" object:nil];
//Name是通知的名称 object是通知的发布者(是谁要发布通知,也就是对象) userInfo是一些额外的信息(通知发布者传递给通知接收者的信息内容,字典格式)
// [NSNotification notificationWithName:@"123" object:nil userInfo:nil];
//发送通知
[[NSNotificationCenter defaultCenter] postNotification:notification];
- 最后移除观察者
- (void)dealloc {
//删除根据name和对象,如果object对象设置为nil,则删除所有叫name的,否则便删除对应的
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil];
}
KVO
- KVO全称叫Key Value Observing,顾名思义就是一种观察者模式用于监听属性的变化
是一种没有中心枢纽的观察者模式的实现方式。一个主题对象管理所有依赖于它的观察者对象,并且在自身状态发生改变的时候主动通知观察者对象。
- KVO和NSNotification有很多相似的地方,
- 1.注册观察者
[object addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew context:]。
- 2.更改主题对象属性的值,即触发发送更改的通知.
- 3.在制定的回调函数中,处理收到的更改通知。
响应观察者
observeValueForKeyPath:ofObject:change:context:
4.注销观察者
[object removeObserver:self forKeyPath:property]。
```.