NSNotificationCenter详解
本文转载至 http://blog.csdn.net/chengyingzhilian/article/details/7874408
作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的.
注册通知:即要在什么地方接受消息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mytest:) name:@" mytest" object:nil];
参数介绍:
addObserver: 观察者,即在什么地方接收通知;
selector: 收到通知后调用何种方法;
name: 通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
发送通知:调用观察者处的方法。
[[NSNotificationCenter defaultCenter] postNotificationName:@"mytest" object:searchFriendArray];
参数:
postNotificationName:通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
object:传递的参数
注册方法的写法:
- (void) mytest:(NSNotification*) notification
{
id obj = [notification object];//获取到传递的对象
}
附:注册键盘升启关闭消息
|
看一个程序,里面viewDidLoad中有
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"saveMessage" object:nil];
[center addObserver:self selector:@selector(saveMessage) name:@"saveMessage" object:nil];
不明白为什么先去掉注册者,然后又添加?不是同一个observer吗?
在有需要的类中,发送消息
//发送消息出去,这里的对象是一个数组:saveImageArray
[[NSNotificationCenter defaultCenter] postNotificationName:@"postData" object:saveImageArray];
所有亲朋好友给我给包(发送消息),,,
//注册一个observer来响应消息的传送
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(PostImage:)//接收消息方法
name:@"postData"//消息识别名称
object:nil];
举个例子,过年了,准备一个大的钱包(注册一个OBserver),嘿嘿,,,,
//实现方法
-(void)PostImage:(NSArray *)array
{
//接收传送过来的消息
}
我把红包都收起来,(接收消息)
//移除observer
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"postData" object:nil];
红包都收完了,哈哈,亲朋好友回家咯。。
简单说明,哈哈,不需要理解太复杂。。。。
例说明:KVC用来传送消息,是很不错的。
//kvo注册以parserDatas为例说明:parserDatas是一个解析XML的类
[parserDatas addObserver:self forKeyPath:@"isFinished" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:parserDatas];
//接收变更通知
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{
if ([keyPath isEqual:@"isFinished"]) {
BOOL isFinished=[[change objectForKey:NSKeyValueChangeNewKey] intValue];
if (isFinished) {//如果服务器数据接收完毕
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObjectsFromArray:parserDatas.parsedDataArray];
//保存数据
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
NSString *path = [DOCUMENT_PATH stringByAppendingPathComponent:@"AllXmlDataArray.bin"];
[NSKeyedArchiver archiveRootObject:array toFile:path];
[array release];
//取消kvo注册
[object removeObserver:self
forKeyPath:@"isFinished"];
}
}else{
// be sure to call the super implementation
// if the superclass implements it
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
}
在parserDatas类中定义:
+ (BOOL):(NSString*)key
{
//当这两个值改变时,使用自动通知已注册过的观察者,观察者需要实现observeValueForKeyPath:ofObject:change:context:方法
if ([key isEqualToString:@"isFinished"])
{
return YES;
}
return [super automaticallyNotifiesObserversForKey:key];
}
发送变更通知:
在需要跟踪消息记录的函数中加入:
[self setValue:[NSNumber numberWithBool:YES] forKey:@"isFinished"];
不用的时候,才注销掉的。。
一般放在dealloc....里面。
- (void)awakeFromNib{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(switchViews:)
name:@"switchViews"
object:nil];
}
- (void)switchViews:(NSNotification*)notification{
NSNumber *viewNumber = [notification object];
NSInteger i = [viewNumber integerValue];
[self setSelectedSegmentIndex:i];
UIView *chosenView = nil;
switch (i) {
case 0:
chosenView = view1;
break;
case 1:
chosenView = view2;
break;
case 2:
chosenView = view3;
break;
default:
break;
}
if (chosenView) {
[[viewController view] bringSubviewToFront:chosenView];
}
}
- (void)dealloc{
[super dealloc];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
NSNotificationCenter详解的更多相关文章
- iOS NSNotificationCenter详解
通知中心的特点: 1:同步执行 2: 一对多发送消息 3: 降低程序耦合度 通知中心是单例,目的就是从任意一个发送消息到任意一个接收者,是同步执行的. 那么什么是同步呢? 用网上经典的说法,就是我叫朋 ...
- iOS开发——实用技术OC篇&事件处理详解
事件处理详解 一:事件处理 事件处理常见属性: 事件类型 @property(nonatomic,readonly) UIEventType type; @property(nonatomic ...
- iOS中MVC等设计模式详解
iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...
- 《招一个靠谱的移动开发》iOS面试题及详解(下篇)
iOS面试知识点 现在进入本篇的正题.本篇的面试题是我认为比较好的iOS开发基础知识点,希望大家看过这后在理解的基础上掌握而不是死记硬背.死记硬背很快也会忘记的. 1 iOS基础 1.1 父类实现深拷 ...
- 《招一个靠谱的移动开发》iOS面试题及详解(上篇)
以下问题主要用于技术的总结与回顾 主要问题总结 单例的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 多线程.特别是NSOperation 和 GCD ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
随机推荐
- apache的动态和静态
apache的动态和静态 http://www.cnblogs.com/eoiioe/archive/2008/12/23/1360476.html(2.0和2.2一样) 关于apache的动态与静 ...
- centos7 mongodb3.2与3.4版本安装(转)
一.安装环境及配置yum vi /etc/yum.repos.d/mongodb-org-3.2.repo [mongodb-org-3.2] name=MongoDB Repository base ...
- leetcode 题解:Merge Sorted Array(两个已排序数组归并)
题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume ...
- 解决Mac安装M2Crypto提示无法找到openssl头文件问题
大概是这种问题 running build running build_py running build_ext building'M2Crypto.__m2crypto' extension swi ...
- JAVA Eclipse 启动 Eclipse 弹出“Failed to load the JNI shared library jvm_dll”怎么办
原因1:给定目录下jvm.dll不存在. 对策:(1)重新安装jre或者jdk并配置好环境变量.(2)copy一个jvm.dll放在该目录下. 原因2:eclipse的版本与jre或者jdk版本不一致 ...
- 尝试一下markdown
尝试一下markdown 简单介绍以下几个宏: __VA_ARGS__是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持).宏前面加上##的 ...
- vuex简单示例
一.vuex是什么,解决了什么问题? 官方解释是:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生 ...
- Linux下的非阻塞IO(一)
非阻塞IO是相对于传统的阻塞IO而言的. 我们首先需要搞清楚,什么是阻塞IO.APUE指出,系统调用分为两类,低速系统调用和其他,其中低速系统调用是可能会使进程永远阻塞的一类系统调用.但是与磁盘IO有 ...
- C++Singleton的DCLP(双重锁)实现以及性能测评
本文系原创,转载请注明:http://www.cnblogs.com/inevermore/p/4014577.html 根据维基百科,对单例模式的描述是: 确保一个类只有一个实例,并提供对该 ...
- WIN10 当中装BDM驱动
方法: 禁用第三方签名 将插件替换原有的dll 1.参考此篇文档 http://jingyan.baidu.com/article/375c8e19c2b25b25f2a229a3.html ...