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大概就是这些了。

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

  1. 安卓中不同APP之间的消息通信

    昨天在腾讯实习生招聘初试面试时面试官问道我关于两个APP之间相互通信的方式,当时自己回道到了contentProvider与BroadcastReceiver.但他接着问还有没有其它的方式,我跟他说可 ...

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

    前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细 ...

  3. IOS 如何选择delegate、notification、KVO?

    IOS 如何选择delegate.notification.KVO? 博客分类: IOS   前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有 ...

  4. Android IOS WebRTC 音视频开发总结(七五)-- WebRTC视频通信中的错误恢复机制

    本文主要介绍WebRTC视频通信中的错误恢复机制(我们翻译和整理的,译者:jiangpeng),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blac ...

  5. NSNotificationCenter消息通信(KVO)

    NSNotificationCenter是程序不同类间的消息通信. 注册消息通知: [[NSNotificationCenter defaultCenter]addObserver:self sele ...

  6. delegate notification kvo三者比较

    IOS 如何选择delegate.notification.KVO? 前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类 ...

  7. 消息通信机制NSNotificationCenter -备

    消息通信机制NSNotificationCenter的学习.最近写程序需要用到这类,研究了下,现把成果和 NSNotificationCenter是专门供程序中不同类间的消息通信而设置的,使用起来极为 ...

  8. IOS 消息机制(NSNotificationCenter)

    消息机制 NSNotificationCenter 一直都在频繁使用,但是却对其原理不是十分了解.今天就花些时间,把消息机制原理重头到尾好好过一遍. iOS 提供了一种 "同步的" ...

  9. IOS - 消息推送原理和实现

    一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1.Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Pr ...

随机推荐

  1. altium designer14的Import wizard 为空的解决方法

    1.首先将安装盘放到光驱里面,如果是虚拟光驱安装,请运行iso文件. 2. 点击DXP-->>Externtion and updates 3. 出现下列界面,选择右面的configure ...

  2. 【Xamarin开发IOS-IOS生命周期】

    iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受 ...

  3. linux 命令后台执行

    我想把updatedb命令(用于重新建立整盘索引的命令)放在后台运行.因为我不想眼睁睁的看着机器建立索引,我还想编会儿程序呢: # updatedb & [1] 23336 注释:在所要执行的 ...

  4. C++基础回顾1(数据类型, 控制语句, 数组)

    最近两天打开本科学校的C++教材,快速回顾了一下C++方面的内容.虽然书本内容比较基础,但是还是有些知识点值得自己强化记忆.分几篇文章,加上自己的理解记录如下. 先回顾面向过程的部分. C++数据类型 ...

  5. C++类静态成员的初始化和用法探讨

    一.一般类型的类的静态变量 1.首先看下面的代码: class CTest1 { public: static int m_num1; void printNum(){cout << m_ ...

  6. cocos2d-x ios 设置横屏/竖屏(全)

    Cocos2d-x项目\iOS\RootViewController.mm文件中. 以下方法任选其一即可…      本人机子函数二ok! 函数一: (BOOL)shouldAutorotateToI ...

  7. Apache+php配置 Mysql安装出错解决办法

    此文包括的注意内容:软件版本及下载地址Apache2.4的配置和安装php7.0的配置mysql5.5的安装常见问题及解决方法1.软件版本Windows server 2008 r2+ 64位Apac ...

  8. Entify Framewrok - LINQ简单使用

    1.如何使用Join: http://www.devcurry.com/2011/01/join-example-in-linq-and-c.html

  9. java 正则表达式获取值

    @Test public void testtest() { String test = "hahahhehe sendCode\":\"12367890123rsdfs ...

  10. iOS 提示音播放

    首先找到对应的素材 音频文件 写一个类继承 NSObject 命名为AudioUtil 导入支撑文件 #import <AVFoundation/AVFoundation.h> #impo ...