ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别
一、Delegate
Delegate本质是一种程序设计模型,iOS中使用Delegate主要用于两个页面之间的数据传递。iphone中常用@protocol和delegate的机制来实现接口的功能。例如想在A的功能要在B中实现,可以在A中定义一个Protocol。
2、声明一个protocol,前缀为protocol :
@protocol myViewDelegate
-(void) Fun1;
具体实现中时:
-(void)action{
NSNotification是用来在类之间传递消息参数的。每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似公共栏。
对象注册关注某个确定的notification(比如说老师通知今天上午课取消). 我们把这些注册对象叫做 observer. 其它的一些对象会给center发送notifications(今天上午课取消). center将该notifications转发给所有注册对该notification感兴趣的对象. 我们把这些发送notification的对象叫做 poster。
具体使用方法有四个步骤:
1、定义一个事件到来时该执行的方法;
- - (void)stopClass:(NSNotification*)notification{
- //今天不上课
- }
2、注册观察者;
参数介绍:
addObserver: 观察者,即在什么地方接收通知;
selector: 收到通知后调用何种方法;
name: 通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的;
object:传递的参数
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(stopClass:)
- name:@"NotoficationName"
- object:nil];
3、激发事件,即通知相应的观察者;
- [[NSNotificationCenter defaultCenter] postNotificationName:@"NotoficationName"
- object:nil];
代码到这里,- (void)stopClass:(NSNotification*)notification方法就会执行了;事件只会在当前的 NotificationCenter 中广播,不同的 NotificationCenter 之间的事件通知互不相干(就像上面的例子,今天上午课取消只是针对我班,不影响别班)
4、移除通知;(最后,你的观察者如果对一些事件没兴趣了,应该从 NotificationCenter 中移除掉)
- //与注册时相同
- [[NSNotificationCenter defaultCenter] removeObserver:self
- name:@"NotoficationName"
- object:nil];
- //或者
- [[NSNotificationCenter defaultCenter] removeObserver:self];
三、KVO
KVO,全称为Key-Value Observing,是iOS中的一种设计模式。用于检测对象的某些属性的实时变化情况并作出响应,即当指定的对象的属性被修改后,则对象就会接受到通知,简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。与NSNotification相比之下KVO更加简洁而直接。
KVO的使用也很简单,就是简单的3步:
1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:
2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用
3.取消注册观察removeObserver:forKeyPath:context:
实例:假设我在双十一之前看中一件衣服,双十一衣服价格会有变动,我需要监听衣服的价格变动。
1、定义一个Model
- @interface DataModel:NSObject (){
- DataModel *shirtForKVO;
- UILabel *myLabel;
- UIButton *myButton;
- NSString *shirt;
- float price;
- }
2、实例化
- - (void)viewDidLoad {
- shirtForKVO = [[DataModel alloc] init];
- [shirtForKVO setValue:@"myShirt" forKey:@"shirt"];
- [shirtForKVO setValue:@"150.0" forKey:@"price"];
- [shirtForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
- myLabel = [[UILabel alloc] initWithFrame:(CGRect){,,,}];
- myLabel.text = [shirtForKVO valueForKey:@"price"];
- myLabel.textColor = [UIColor orangeColor];
- [self.view addSubview:myLabel];
- myButton = [[UIButton alloc] initWithFrame:(CGRect){,,,}];
- myButton.backgroundColor = [UIColor purpleColor];
- [myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:myButton];
- }
3、当点击button的时候,调用buttonAction方法,修改对象的属性
- - (void)buttonAction{
- [shirtForKVO setValue:@"100.0" forKey:@"price"];
- }
4、实现回调方法
- - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
- if ([keyPath isEqualToString:@"price"]) {
- myLabel.text = [shirtForKVO valueForKey:@"price"];
- }
- }
5、移除观察者
- - (void)dealloc{
- [shirtForKVO removeObserver:self forKeyPath:@"price"];
- }
四、Delegate 、NSNotification 、KVO之间的联系及其区别
区别:
delegate方法往往需要关注返回值, 也就是delegate方法的结果。
delegate只是一对一,而NSNotification、KVO可以一对多,两者都没有返回值。
各自特点:
NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。
KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,所以比较容易出错。
delegate方法最典型的特征是往往需要关注返回值。
ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别的更多相关文章
- ios基础篇(八)——UITabBarController的简单介绍
一.简介 UITabBarController和UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型的例子就 ...
- WF4.0 基础篇 (十八) Flowchar
本节主要介绍WF4 中 Flowchart的使用 本文例子下载: http://files.cnblogs.com/foundation/FlowcharSample.rar 本文例子说明 Flowc ...
- ios基础篇(二)——UIImageView的常见用法
UIImageView是在界面上显示图片的一个控件,在UIImageView中显示图片的话应该首先把图片加载到UIImage中,然后通过其他方式使用该UIImage. 创建UIImageView有两种 ...
- 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)
1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...
- 《手把手教你》系列基础篇(八十四)-java+ selenium自动化测试-框架设计基础-TestNG日志-上篇(详解教程)
1.简介 TestNG还为我们提供了测试的记录功能-日志.例如,在运行测试用例期间,用户希望在控制台中记录一些信息.信息可以是任何细节取决于目的.牢记我们正在使用Selenium进行测试,我们需要有助 ...
- 《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)
1.简介 TestNG为日志记录和报告提供的不同选项.现在,宏哥讲解分享如何开始使用它们.首先,我们将编写一个示例程序,在该程序中我们将使用 ITestListener方法进行日志记录. 2.Test ...
- 《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
1.简介 自动化测试中如何输出日志文件.任何软件,都会涉及到日志输出.所以,在测试人员报bug,特别是崩溃的bug,一般都要提供软件产品的日志文件.开发通过看日志文件,知道这个崩溃产生的原因,至少知道 ...
- 《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-上篇(详解教程)
1.简介 Apache Log4j 是一个非常古老的日志框架,并且是多年来最受欢迎的日志框架. 它引入了现代日志框架仍在使用的基本概念,如分层日志级别和记录器. 2015 年 8 月 5 日,该项目管 ...
- Bootstrap <基础二十八>列表组
列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...
随机推荐
- Spring+Mybatis+Maven+MySql搭建实例
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何使用Maven来搭建Spring+Mybatis+MySql的的搭建实例 ...
- linux svn服务器svnserve 安装配置
svnserve 是一个轻量级的服务, 使用自定义的协议通过TCP/IP与客户端通讯.客户端通过由 svn:// 或者 svn+ssh:// 开始的URL访问svnserve服务器. svn服务器有两 ...
- 执行gem install linne时报错
由于linner安装实际上是从 rubygems.org 获得的,而其被墙,所以,需要寻找国内的镜像进行安装: 第一种方法: gem sources --remove https://rubygems ...
- 替换所有字符串,获取url参数值
替换所有的字符串: var newStr = str.replace(/null/g, ""); 获取url参数值 <script type="text/javas ...
- 无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的排序规则冲突。
select * from a, b where a.Code=b.Code collate Chinese_PRC_CI_AS
- How to locate a path? - Unix & Linux Stack Exchange
How to locate a path? - Unix & Linux Stack Exchange http://unix.stackexchange.com/questions/2955 ...
- Burning Bridges-ZOJ1588(割边求解)
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...
- Unity使用反射探头实现地面的镜面反射
最近在看之前的愤怒机器人demo,它的反射通过一个反射相机实现 我尝试在unity5里用反射探头做出镜面反射,但想要调的准确倒是比较难.. .. 后来朋友发我一份反射探头实现镜面反射的文章,解决了这个 ...
- linux dynamic debug 官方教程
下载内核后,文档在:Documentation/dynamic-debug-howto.txt 中文版本:http://www.oschina.net/translate/dynamic-debug- ...
- jQuery 效果 —— 隐藏和显示
jQuery 效果 -- 隐藏和显示 1.隐藏和显示 (1)在jQuery中我们可以使用hide()和show()分别隐藏和显示HTML元素: //隐藏元素 $("button") ...