什么是观察者模式???

A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化。这就是观察者模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己或者做出相应的一些动作。在IOS开发中我们接触到观察者模式的实现方式有NSNotificationCenter、KVO等.

通知中心

以NSNotificationCenter为中心,观察者往Center中注册对某个主题对象的变化感兴趣,主题对象通过NSNotificationCenter进行变化广播。所有的观察和监听行为都向同一个中心注册,所有对象的变化也都通过同一个中心向外广播。

通知中心执行顺序

  1. 通过NSNotificationCenter的addObserver:selector:name:object接口来注册通知中心.
  2. 被观察的对象,通过postNotificationName:object:userInfo:向通知中心发送某一类型通知.
  3. 当有通知来的时候,Center会调用观察者注册的接口来广播通知,同时传递存储着更改内容的NSNotification对象.
  4. 当该通知不再使用时,可以在dealloc方法里removeObserver:删除观察者.

KVO键值观察

这是一个典型的观察者模式,观察者在键值改变时会得到通知.
NSKeyValueObserving非正式协议定义了一种机制,它允许对象去监听其它对象的某个属性的修改.NSObject提供了一个NSKeyValueObserving协议的默认实现,它为所有对象提供了一种自动发送修改通知的能力.我们可以通过禁用自动发送通知并使用这个协议提供的方法来手动实现通知的发送,以便更精确地去处理通知.

KVO的使用步骤

  • 注册需要观察的对象的属性addObserver:forKeyPath:options:context:.
  • 实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用.在这个方法中还通过NSKeyValueObservingOptionNew这个参数要求把新值在dictionary中传递过来.
  • 取消注册观察removeObserver:forKeyPath:context:.

手动设置KVO

//关闭某key值的KVO+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {BOOL automatic = YES; if ([key isEqualToString:@"age"]) { automatic = NO; } else { automatic = [super automaticallyNotifiesObserversForKey:key]; } return automatic; } //重写setter方法手动设置KVO - (void)setAge:(int)age { //手动设置KVO if (_age != age) { [self willChangeValueForKey:@"age"]; _age = age; [self didChangeValueForKey:@"age"]; } }

KVO的实现原理

当某一个类的实例第一次使用KVO的时候,系统就会在运行期间动态的创建该类的一个派生类,该类的命名规则一般是以NSKVONotifying为前缀,以原本的类名为后缀。并且将原型的对象的isa指针指向该派生类。同时在派生类中重载了使用KVO的属性的setter方法,在重载的setter方法中实现真正的通知机制,正如前面我们手动实现KVO一样。这么做是基于设置属性会调用 setter 方法,而通过重写就获得了 KVO 需要的通知机制。当然前提是要通过遵循 KVO 的属性设置方式来变更属性值,如果仅是直接修改属性对应的成员变量,是无法实现 KVO 的。

转载于:https://www.cnblogs.com/VzhanggengD/p/6626381.html

OC 观察者模式(通知中心,KVO)相关推荐

  1. PHP观察者通知机制,观察者模式-通知详解

    观察者模式也叫发布/订阅模式,是软件设计模式中的一种.在这种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通 ...

  2. 通知中心NSNotificationCenter的使用

    通知中心NSNotificationCenter的使用 Cocoa框架中,通知中心以及KVO都属于设计模式中的观察者. Source 在使用通知中心之前,对通知中心类进行了简单的封装,以便可读性更强. ...

  3. iOS 通知中心(NSNotificationCenter)

    NSNotificationCenter 在这里第一步和第二步的顺序可以互换,一般楼主我喜欢先在需要发送消息的页面发送消息,然后再在需要监听的页面注册监听.要注意的是不管是通知中心还是KVO都需要在页 ...

  4. 通知中心 NSNotificationCenter 的简单使用方法

    NSNotificationCenter(通知中心)   [注意]需再dealloc中移除观察者   获取通知中心单例对象 NSNotificationCenter *center=[NSNotifi ...

  5. IOS中通知中心(NSNotificationCenter)的使用总结

    IOS中通知中心NSNotificationCenter应用总结 一.了解几个相关的类 1.NSNotification 这个类可以理解为一个消息对象,其中有三个成员变量. 这个成员变量是这个消息对象 ...

  6. iOS开发之通知中心(NSNotificationCenter)

    前言 面向对象的设计思想是把行为方法封装到每一个对象中,以用来增加代码的复用性.正是这种分散封装,增加了对象之间的相互关联,总是有很多的对象需要彼此了解以及相互操作! 一个简单示例说明这种交互产生的对 ...

  7. mac android通知中心,少数派一周快读:iOS 8 输入法大比拼,升级 Mac 新系统的 6 项准备,如何保持 Android 通知栏整洁...

    又到少数派一周快读的时间,上周我们迎来了苹果与谷歌两大豪门的新品发布,看来未来的移动互联网市场上两强相争的局面将会持续下去.新系统新特性即将上线,我们也一起来盘点一下上周最热和最值得推荐的内容吧. 上 ...

  8. Cocos2d-x CCNotificationCenter 通知中心

    相信接触过ios开发的人来说对NSNotificationCenter都不陌生.而在cocos2d-x中也参照这个类,提供了CCNotificationCenter这个类,用作通知中心. 那么Noti ...

  9. Mac OS X 通知中心彻底删除网站的通知

    前几天发现莫名其妙电脑右上角会蹦出来"北美省钱快报"的通知. 上网找了一圈,都是说要删除~/Library/Application Support/下的blabla, 这个方法可能 ...

最新文章

  1. 从“冰柜”到“冰棍儿”,下载Github单个文件
  2. virtual DOM和真实DOM的区别_让虚拟DOM和DOMdiff不再成为你的绊脚石
  3. Activity生命周期的学习和验证
  4. 【动态代理】从源码实现角度剖析JDK动态代理
  5. 聊聊CTR预估算法DeepFM
  6. C# 观察者模式 以及 delegate 和 event
  7. vendor自动恢复_push文件到system分区,重启后文件会被自动恢复
  8. 阿里达摩院提出新型优化方法,一行代码即可替换现有优化器
  9. JavaScript之函数实例属性和类属性
  10. 教你如何做到显示 Dialog Box(对话框)
  11. (HDOJ 2043)密码
  12. 蒙特卡洛模型之神奇的布丰投针实验
  13. linux snoop抓包命令,Snoop抓包工具用法简介.doc
  14. 人机对话_javaweb_ 一对一聊天系统
  15. 设置win2003远程桌面允许2个以上会话
  16. win10实现debug
  17. 动态规划之神奇的口袋
  18. TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5
  19. 手机拍照上传图片旋转角度问题
  20. 贝叶斯网专题1:信息论基础

热门文章

  1. 符合我公司GIS开源解决方案的探讨
  2. 学习:java原理—反射机制
  3. 比尔·盖茨----十一项人生建议
  4. 受网友U2U之托,DevComponents出品的TreeGX最新版本Patch出炉
  5. vue中v-on指令的使用之Vue知识点归纳(四)
  6. CSS可见区域全局居中
  7. Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决...
  8. Javascript预解析、作用域、作用域链
  9. Linux下部署ASP.NET服务连接oracle遇到的问题记录
  10. [jQuery基础] jQuery案例 -- 新浪微博