码迷,mamicode.com
首页 > 移动开发 > 详细

ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别

时间:2015-12-25 18:45:05      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

一、Delegate

Delegate本质是一种程序设计模型,iOS中使用Delegate主要用于两个页面之间的数据传递。iphone中常用@protocol和delegate的机制来实现接口的功能。例如想在A的功能要在B中实现,可以在A中定义一个Protocol。

protocol用法:
@interface ClassA :ClassB<protocol1, protocol2>
1、首先声明一个UIView类:
@interface myView  :UIView{  }
@end;

2、声明一个protocol,前缀为protocol :

@protocol myViewDelegate

-(void) Fun1;

-(void) Fun2;
@end;
3、之后就是代理委托人,委托的声明方式如下,我们要在ClassB内使用Fun1方法,但是不需要做声明:
@interface ClassB :UIViewController<myViewDelegate>
@end
4、ClassB实现:
@implement ClassB
 -init{
        MyView *view = [[MyView alloc]init];
        view.delegate = self;
        self.view = view;
       }
-(void)Fun1{
       }
@end

 

如果要在ClassA中使用Fun1,需要在ClassA的声明中添加:

 

@interface myView  :UIView{

 

id<myViewDelegate> delegate;

 

}

 

@property ...

 

@end

具体实现中时:

-(void)action{

 

  [delegate Fun1];

 

}
二、NSNotification

NSNotification是用来在类之间传递消息参数的。每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似公共栏。

 对象注册关注某个确定的notification(比如说老师通知今天上午课取消). 我们把这些注册对象叫做 observer. 其它的一些对象会给center发送notifications(今天上午课取消). center将该notifications转发给所有注册对该notification感兴趣的对象. 我们把这些发送notification的对象叫做 poster。

具体使用方法有四个步骤:

1、定义一个事件到来时该执行的方法

1 - (void)stopClass:(NSNotification*)notification{
2     
3 //今天不上课
4 
5 }

2、注册观察者

参数介绍:

addObserver: 观察者,即在什么地方接收通知;

selector: 收到通知后调用何种方法;

name: 通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的;

object:传递的参数

1     [[NSNotificationCenter defaultCenter] addObserver:self
2                                              selector:@selector(stopClass:)
3                                                  name:@"NotoficationName"
4                                                object:nil];

3、激发事件,即通知相应的观察者

1 [[NSNotificationCenter defaultCenter] postNotificationName:@"NotoficationName"
2                                                         object:nil];

代码到这里,- (void)stopClass:(NSNotification*)notification方法就会执行了;事件只会在当前的 NotificationCenter 中广播,不同的 NotificationCenter 之间的事件通知互不相干(就像上面的例子,今天上午课取消只是针对我班,不影响别班)

4、移除通知;(最后,你的观察者如果对一些事件没兴趣了,应该从 NotificationCenter 中移除掉)

1 //与注册时相同
2     [[NSNotificationCenter defaultCenter] removeObserver:self
3                                                     name:@"NotoficationName"
4                                                   object:nil];
5     //或者
6     [[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

1 @interface DataModel:NSObject (){
2     DataModel *shirtForKVO;
3     UILabel *myLabel;
4     UIButton *myButton;
5     
6     NSString *shirt;
7     float price;
8 
9 }

2、实例化

 1 - (void)viewDidLoad {
 2    
 3     shirtForKVO = [[DataModel alloc] init];
 4     [shirtForKVO setValue:@"myShirt" forKey:@"shirt"];
 5     [shirtForKVO setValue:@"150.0" forKey:@"price"];
 6     [shirtForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
 7     
 8     myLabel = [[UILabel alloc] initWithFrame:(CGRect){0,100,200,50}];
 9     myLabel.text = [shirtForKVO valueForKey:@"price"];
10     myLabel.textColor = [UIColor orangeColor];
11     [self.view addSubview:myLabel];
12 
13     myButton = [[UIButton alloc] initWithFrame:(CGRect){0,20,50,30}];
14     myButton.backgroundColor = [UIColor purpleColor];
15     [myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
16     [self.view addSubview:myButton];
17     
18     
19 }

3、当点击button的时候,调用buttonAction方法,修改对象的属性

1 - (void)buttonAction{
2 
3     [shirtForKVO setValue:@"100.0" forKey:@"price"];
4 
5 }

4、实现回调方法

1 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
2     
3     if ([keyPath isEqualToString:@"price"]) {
4         myLabel.text = [shirtForKVO valueForKey:@"price"];
5     }
6 
7 }

5、移除观察者

1 - (void)dealloc{
2 
3     [shirtForKVO removeObserver:self forKeyPath:@"price"];
4     
5 }

四、Delegate 、NSNotification 、KVO之间的联系及其区别

区别:

delegate方法往往需要关注返回值, 也就是delegate方法的结果。

delegate只是一对一,而NSNotification、KVO可以一对多,两者都没有返回值。

各自特点:

NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,所以比较容易出错。

delegate方法最典型的特征是往往需要关注返回值。

 

ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别

标签:

原文地址:http://www.cnblogs.com/0320y/p/5076463.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!