iOS: 消息通信中的Notification&KVO

iOS: 消息通信中的Notification&KVO

在 iOS: MVC 中,我贴了张经典图:

其中的Model向Controller通信的Noification&KVO为何物呢?

在功能上说,delegate、Notification以及KVO的功能类似,都是作用于 OC中对象 的消息通信。但三者的使用场景是不同的。

简单的说Delegate是一种回掉函数,更多的用在一对一的场合,可参考 iphone:delegate机制 ;

Notification 用得较少,使用Notification Center,类似广播方式,所以更适合一对多的通信;

KVO,key-Value-Observing,观察者模式,适用于侦听另一对象的属性的变化。

三者的详细区别可以参考另一博文:http://mobile.51cto.com/iphone-386316.htm

Notification:

notification的使用十分简单,直接看代码:

    //使用类方法获取实例
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

    //增加2个消息监听,消息名都为logInfo,一个在本对象中监听,监听方法GetInfo;一个在oneobj对象监听,监听方法oneObjHandleInfo。
    [center addObserver:self selector:@selector(GetInfo:) name:@"logInfo" object:nil];
    [center addObserver:oneobj selector:@selector(oneObjHandleInfo:) name:@"logInfo" object:nil];

    //发送消息,消息名logInfo,传递数据为一个NSString
    [center postNotificationName:@"logInfo" object:@"00000"];

对应的2个接收方法:

//本对象中...
-(void) GetInfo:(NSNotification *) notificaion{
    //取得接受数据并打印
    NSString *data = [notificaion object];
    NSLog(@">> %@",data);
}

//OneObj对象中...
-(void) oneObjHandleInfo:(NSNotification*) notification{
    //取得接受数据并打印
    NSString *data = [notification object];
    NSLog(@">>OneOBJ %@",data);
}

这样就实现了post一个消息的时候,对应的2个监听者都能收到消失并做出相关处理。最后要注意的是在不用的时候把对应的监听给remove掉。

    [center removeObserver:self name:@"logInfo" object:nil];
    [center removeObserver:oneobj name:@"logInfo" object:nil];

KVO:

在看KVO之前,有必要先了解下KVC,即,Key-Value Coding 键值对编程。通过key-value可以方便的存取数据。

具体的操作简单说就是:setValue:forKey:   valueForKey:

//book Object
//.h
#import <Foundation/Foundation.h>
@class Author;
@interface Book : NSObject{
    NSString *name;
    Author *author;
    float price;
    NSArray *relativeBooks;
}
@end
//.m
#import "Book.h"
@implementation Book
@end

    Book *book = [[Book alloc] init];
    [book setValue:@"iOS book" forKey:@"name"];
    NSString *name = [book valueForKey:@"name"];
    NSLog(@">> %@",name);

    Author *author = [[Author alloc] init];
    [author setValue:@"Zhan" forKey:@"name"];
    [book setValue:author forKey:@"author"];

    NSString *authorName = [book valueForKeyPath:@"author.name"];
    NSLog(@">> %@",authorName);

    [book setValue:@"100" forKey:@"price"];
    NSLog(@">> %@",[book valueForKey:@"price"]);

    Book *book1 = [[Book alloc] init];
    [book1 setValue:@"4" forKey:@"price"];
    Book *book2 = [[Book alloc] init];
    [book2 setValue:@"6" forKey:@"price"];

    NSArray *books = [NSArray arrayWithObjects:book1,book2,nil];
    [book setValue:books forKey:@"relativeBooks"];
    NSLog(@">>%@",[book valueForKeyPath:@"relativeBooks.price"]);

更详细的KVC介绍可以参考: http://marshal.easymorse.com/tech/objc-%E4%BD%BF%E7%94%A8kvc

KVO是基于kvc实现的,采取的是观察者的模式:

    book4=[[Book alloc] init];
    //增加观察者,为本类,keypath为book中的price对象,所以为price
    [book4 addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
    //修改值
    [book4 setValue:@"4" forKey:@"price"];

//回掉方法
-(void) observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context{
    NSLog(@"cel back");
    if([keyPath isEqual:@"price"]){
        NSLog(@">>>>>>>price is changed");
        NSLog(@"old price is %@",[change objectForKey:@"old"]);
        NSLog(@"new price is %@",[change objectForKey:@"new"]);
    }
}

这样便实现了当对象属性改变时,做出相应反应。

更详细KVO实现也可以参照:http://blog.csdn.net/yuquan0821/article/details/6646400

那KVC、KVO内部是如何实现的呢?

“一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。

因为KVC的实现机制,可以很容易看到某个KVC操作的Key,而后也很容易的跟观察者注册表中的Key进行匹对。假如访问的Key是被观察的Key,那么我们在内部就可以很容易的到观察者注册表中去找到观察者对象,而后给他发送消息。”

详细check:http://www.cocoadev.cn/Cocoadev/KVO-20100222-0627.asp

iOS中oc通信的通知和KVO大概就是这些了。

时间: 2024-12-22 22:45:32

iOS: 消息通信中的Notification&KVO的相关文章

【转载】iOS中delegate,notification,KVO三种模式实现通信的优缺点

原帖地址:http://blog.csdn.net/yangxt/article/details/8176636 在开发iOS中,有三种模式来实现controller之间的通信: 1.委托delegation: 2.通知中心Notification Center: 3.键值观察key value observing,KVO 因此,那为什么我们需要这些模式以及什么时候用它以及什么时候不用它. 1.delegate 基本特征: 一 个controller定义了一个协议(即一系列的方法定义).该协议描

IOS 如何选择delegate、notification、KVO?

前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细的分析了三者之间的区别以及各自的优势,博文地址为http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/,因为博文是用英文写的,下面将其翻译成中文. 在开发ios应用的时候,我们会经常遇到一个常见的问题

iOS通讯篇iOS 如何选择delegate、notification、KVO? .

原文地址http://blog.csdn.net/dqjyong/article/details/7685933 前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细的分析了三者之间的区别以及各自的优势,博文地址为http://blog.shinetech.com/2011/06/14/delegation-notification-and-obse

IOS 如何选择delegate、notification、KVO?(转)

前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细的分析了三者之间的区别以及各自的优势,博文地址为http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/,因为博文是用英文写的,下面将其翻译成中文. 在开发ios应用的时候,我们会经常遇到一个常见的问题

iOS 如何选择delegate、notification、KVO

开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation: 2.通知中心Notification Center: 3.键值观察key value observing,KVO 因此,那为什么我们需要这些模式以及什么时候用它以及什么时候不用它. 下面完全根据我的开发经验来讨论这三中模式.我将讨论为什么我觉得某种模式要好于另外一种模式以及为什么我觉得在一定的环境下某中模式

NSNotificationCenter消息通信机制介绍(KVO)

NSNotificationCenter消息通信机制介绍(KVO) 作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息                [[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(mytest:) name:@" mytest" object:nil];        参数介绍:         

iOS 中KVC、KVO、NSNotification、delegate 总结及区别

iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的关键技术之一. Demo: @interface myPerson : NSObject { NSString*_name; int      _age; int      _height; int      _w

IOS OS X 中集中消息的传递机制

1 KVO (key-value Observing) 是提供对象属性被改变是的通知机制.KVO的实现实在Foundation中,很多基于 Foundation 的框架都依赖与它.如果只对某一个对象的值的改变感兴趣的话.就可以使用KVO消息传递.满足KVO的前提条件:1接受者(接受对象改变的通知的对象)需要知道发送者(值会改变的对象):2,接受者需要知道发送者的生命周期,因为它需要在发送者被销毁前注销观察者身份.如果这两个要求都符合的话,这个消息传递机制可以一对多(多个观察者可以注册同一个对象的

iOS开发中通知(Notification)快速入门及推送通知实现教程

iOS开发中通知(Notification)快速入门及推送通知实现教程 标签: NSNotificationCenterNSNotification 2016-11-14 00:18 232人阅读 评论(0) 收藏 举报  分类: iOS(400)  转载自:http://www.111cn.NET/sj/ios8/90190.htm 通知(Notification)是开发框架中观察者模式的一种实现方式,内部的实现机制由Cocoa框架支持,通常用于试图控制器和数据模型的交互.通过通知,可以向一个