iOS观察者模式

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变;或者一个对象必须通知其它对象,而它又不能假定其它对象是谁,换言之,我们不希望这些对象是紧密耦合的。这时我们就可以利用到观察者模式。

  • 在IOS中典型的推模型实现方式为NSNotificationCenter和KVO。

NSNotificationCenter

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]。
```. 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是观察者模式?当A对B的变化感兴趣,需要监听B的状态变化,就注册为B的观察者,当B发生变化时通知A,告知B发生...
    _Lily阅读 1,626评论 2 4
  • 观察者模式本质上时一种发布-订阅模型,用以消除具有不同行为的对象之间的耦合,通过这一模式,不同对象可以协同工作,同...
    PlatonsDream阅读 1,333评论 0 0
  • 一.什么是观察者模式? 简单的说就是一个对象拥有多个特征,当某一个特征发生变化时,另外一个对象做出相应的处理和操作...
    LYSNote阅读 4,247评论 0 5
  • 什么是观察者模式?我们先打个比方,这就像你订报纸。比如你想知道美国最近放生了些新闻,你可能会订阅一份美国周刊,然后...
    泥孩儿0107阅读 721评论 0 0
  • 一、观察者模式和发布订阅模式简介 1.1 观察者模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监...
    不知蜕变的挣扎阅读 1,822评论 1 1