文档章节

ios 观察者模式(Notification、KVO)

古乙丁三雨
 古乙丁三雨
发布于 2015/02/26 18:31
字数 504
阅读 70
收藏 0

1、Notification

首先:在B中注册:

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

例如:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(reachabilityChanged:)
                                                 name: kReachabilityChangedNotification
                                               object: nil];

这里的观察对象是self本身,就是我说的b, 观察后响应的方法是

- (void)reachabilityChanged: (NSNotification*)note
{
    [self updateInterfaceWithReachability];
}

里面的name是消息通知的标识(nsstring)的,用来识别是哪个发来的通知

object一般可以写nil,即发送消息的对象

其次:就是a发送消息

发送消息的发放主要有

- (void)postNotification:(NSNotification *)notification;
- (void)postNotificationName:(NSString *)aName object:(id)anObject;
- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

比如,在苹果提供网络监测的Reachability中

[[NSNotificationCenter defaultCenter] postNotificationName: kReachabilityChangedNotification object: noteObject];

没当这个语句跑一次,就会通知消息给b,响应前面注册的aSelector方法

即实现了通知效果

最后就是移除这个观察者模式的方法

- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

 

 

 

 

2、kvo

这里我说简单些

第一步当然也是注册,后面是响应调用的方法

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

跳到NSKeyValueObserving.h文件里面还有其他几种addObserver的方法,和删除观察者的方法,,

上一个列子

[a addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"改变");
}

上面的a其实是一个view。也是被观察者a,self是观察者b,@“frame”是a的一个属性,nskeyvalueobservingoptiongnew是改变后的frame新值,当a的frame改变后,就会触发

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
}

方法。方法里面的change携带frame改变信息

最后如果不要管着者了,,记得 remove掉,NSKeyValueObserving.h文件里面有相对用的remove方法,

                  

 

 

               如有转载,不用表明出处,谢谢!!

 

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 扫描图片像素
古乙丁三雨
粉丝 1
博文 55
码字总数 29925
作品 0
景德镇
程序员
私信 提问
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
2018/05/26
0
0
【干货】iOS开发学习中不易弄清楚的六种开发模式

在我们的实际开发中,架构模式多多少少也有几十种,在很多模式里,相信很多刚开始接触ios的程序员会遇到这类问题,本文小编就为大家详细解说这6种模式应用场景,帮助大家理清思路,学好ios开...

原来是泽镜啊
2018/04/30
0
0
总结一些IOS的面试题吧~不定期更新~附带个人理解的“参考”答案哈

除了MVC模式 你还熟悉什么设计模式 代理模式:当一个类的某些功能需要由别的类实现,但是又不确定具体是哪个类实现的 单例模式:当确保程序运行期间,某个类只有一份实例,用于进行资源共享 ...

RainOrz
2015/08/18
0
0
移动开发之设计模式- 代理模式(IOS&Android)

资源 完全参照 代理模式|菜鸟教程但不包括IOS代码 代理模式 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有...

FlanneryZJ
2018/12/18
0
0
移动开发之设计模式-工厂模式(IOS&Android)

资源 完全参照 工厂模式|菜鸟教程 ,但不包括IOS代码 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳...

FlanneryZJ
2018/12/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 出现了一个小姐姐舔我?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ nnnm : 昨天收到一个分享的英文歌曲,很好听的。本来对于英文歌曲一直不多去琢磨,因为英语学得不好啊!但是这看到首歌的歌词后,才明白:...

小小编辑
10分钟前
11
2
编码规范

4.、编码时的一些建议 1、尽量指定类、方法的final修饰符——虚拟机会想办法内联所有的final方法来减少方法执行时创建栈帧的数量,从而降低栈溢出的风险 2、尽量重用对象——重复new对象会增...

呵呵哒灬
今天
2
0
第一个docker化的java应用

Docker 思想 集装箱 标准化:运输方式/存储方式/API 接口 隔离

BeanHo
今天
1
0
移植Modbus到STM32F103(1):coil、discrete、holding和input的取舍

之前自己给设备写的通信协议,一到工作环境就不停通信错误。思前想后,觉得原因是自己瞎写的协议不好,无法适应有噪音的环境,所以决定移植一个成熟的协议。查了资料,发现Modbus协议简单(容...

Konstantine
今天
0
0
Flutter | 状态管理特别篇——Provide

前言 今天偶然发现在谷歌爸爸的仓库下出现了一个叫做flutter-provide的状态管理框架,2月8日才第一次提交,非常新鲜。在简单上手之后感觉就是一个字——爽!所以今天就跟大家分享一下这个新的...

Vadaski
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部