iOS设计模式之观察者模式
定义
- 什么是观察者模式?我们先打个比方,这就像你订报纸。比如你想知道美国最近放生了些新闻,你可能会订阅一份美国周刊,然后一旦美国有了新的故事,美国周刊就发一刊,并邮寄给你,当你收到这份报刊,然后你就能够了解美国最新的动态。其实这就是观察者模式,A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化。这是一种非常典型的观察者的用法,我把这种使用方法叫做经典观察者模式。当然与之相对的还有另外一种观察者模式——广义观察者模式。
KVO
Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。每次指定的被观察的对象的属性被修改后,KVO自动通知相应的观察者。
KVO的优点:
当有属性改变,KVO会提供自动的消息通知。这样开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知,这是KVO机制提供的最大的优点。因为这个方案已经被明确定义,获得框架级支持,可以方便地采用。
开发人员不需要添加任何代码,不需要设计自己的观察者模型,直接可以在工程里使用。
KVO的架构非常的强大,可以很容易的支持多个观察者观察同 一个属性,以及相关的值。
使用方法:
- 注册需要观察的对象的属性addObserver:forKeyPath:options:context:
- 实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用
- 取消注册观察removeObserver:forKeyPath:context:
Notification
定义一个方法
定义回调,即发生通知了我应该做啥事。(void)callBack{ NSLog(@"我收到通知了!"); }
对象注册,并关联信息
[[NSNotificationCenter defaultCenter] addObserver: self
注册通知,即告诉通知中心,我对啥通知感兴趣
selector: @selector(callBack)
name: @"A类通知"
object: nil];在要发出消息通知的地方
(void)getNotofocation{ NSLog(@"get it."); //发出通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"A类通知" object:self]; }
也可以在需要的时候取消注册通知。