消息通知机制(NSNotification和NSNotificationCenter)

作者:FlyElephant

出处:http://www.cnblogs.com/xiaofeixiang

iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多,类之间的传值用到的比较多,不过委托相对来说只能是一对一,比如说页面A跳转到页面B,页面的B的值改变要映射到页面A,页面C的值改变也需要映射到页面A,那么就需要需要两个委托解决问题。NSNotificaiton则是一对多注册一个通知,之后回调很容易解决以上的问题。

基础概念

iOS消息通知机制算是同步的,观察者只要向消息中心注册, 即可接受其他对象发送来的消息,消息发送者和消息接受者两者可以互相一无所知,完全解耦。这种消息通知机制可以应用于任意时间和任何对象,观察者可以有多个,所以消息具有广播的性质,只是需要注意的是,观察者向消息中心注册以后,在不需要接受消息时需要向消息中心注销,属于典型的观察者模式。

消息通知中重要的两个类:

(1)NSNotificationCenter: 实现NSNotificationCenter的原理是一个观察者模式,获得NSNotificationCenter的方法只有一种,那就是[NSNotificationCenter defaultCenter] ,通过调用静态方法defaultCenter就可以获取这个通知中心的对象了。NSNotificationCenter是一个单例模式,而这个通知中心的对象会一直存在于一个应用的生命周期。

(2) NSNotification: 这是消息携带的载体,通过它,可以把消息内容传递给观察者。

实战演练

1.通过NSNotificationCenter注册通知NSNotification,viewDidLoad中代码如下:

1

2

3

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationFirst:) name:@"First" object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationSecond:) name:@"Second" object:nil];

第一个参数是观察者为本身,第二个参数表示消息回调的方法,第三个消息通知的名字,第四个为nil表示表示接受所有发送者的消息~

回调方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

-(void)notificationFirst:(NSNotification )notification{

NSString name=[notification name];

NSString *object=[notification object];

NSLog(@"名称:%@----对象:%@",name,object);

}

-(void)notificationSecond:(NSNotification )notification{

NSString name=[notification name];

NSString object=[notification object];

NSDictionary dict=[notification userInfo];

NSLog(@"名称:%@----对象:%@",name,object);

NSLog(@"获取的值:%@",[dict objectForKey:@"key"]);

}

2.消息传递给观察者:

1

2

3

4

5

[[NSNotificationCenter defaultCenter] postNotificationName:@"First" object:@"博客园-Fly_Elephant"];

NSDictionary *dict=[[NSDictionary alloc]initWithObjects:@[@"keso"] forKeys:@[@"key"]];

[[NSNotificationCenter defaultCenter] postNotificationName:@"Second" object:@"http://www.cnblogs.com/xiaofeixiang" userInfo:dict];

3.页面跳转:

1

2

3

4

-(void)pushController:(UIButton )sender{

ViewController customController=[[ViewController alloc]init];

[self.navigationController pushViewController:customController animated:YES];

}

4.销毁观察者

1

2

3

4

-(void)dealloc{

NSLog(@"观察者销毁了");

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

 也可以通过name单个删除:

1

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"First" object:nil];

5.运行结果

1

2

3

4

2015-04-26 15:08:25.900 CustoAlterView[2169:148380] 观察者销毁了

2015-04-26 15:08:29.222 CustoAlterView[2169:148380] 名称:First----对象:博客园-Fly_Elephant

2015-04-26 15:08:29.222 CustoAlterView[2169:148380] 名称:Second----对象:http://www.cnblogs.com/xiaofeixiang

2015-04-26 15:08:29.223 CustoAlterView[2169:148380] 获取的值:keso

原文地址:https://www.cnblogs.com/feiyu-mdm/p/8474629.html

时间: 2024-10-17 04:17:54

消息通知机制(NSNotification和NSNotificationCenter)的相关文章

iOS开发-消息通知机制(NSNotification和NSNotificationCenter)

iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多,类之间的传值用到的比较多,不过委托相对来说只能是一对一,比如说页面A跳转到页面B,页面的B的值改变要映射到页面A,页面C的值改变也需要映射到页面A,那么就需要需要两个委托解决问题.NSNotificaiton则是一对多注册一个通知,之后回调很容易解决以上的问题. 基础概念 iOS消息通知机制算是同步的,观察者只要向消息中心注册, 即可接受其他对象发送来的消息,消息发送者和消息接受者两者可以互相一无所知,完

HTML 5的消息通知机制

译文来源:http://www.ido321.com/1130.html 原文:HTML 5 Notification 译文:HTML 5 的消息通知机制 译者:dwqs HTML 5 已经被应用到Web开发中.跟平常一样,任何一个软件新版本的发布都期待一些新的特性,这对HTML 5也不例外.为了仅仅通过HTML提高用户交互,HTML 5已经提供了很多新的API. 是不是非常有趣呢?并且HTML 5已经和CSS 3结合的非常棒了. 因此,我也开始写一系列与HTML 5的API相关的文章来介绍AP

杂谈:HTML 5的消息通知机制

译文来源:http://www.ido321.com/1130.html 原文:HTML 5 Notification 译文:HTML 5 的消息通知机制 译者:dwqs HTML 5 已经被应用到Web开发中.跟平常一样,任何一个软件新版本的发布都期待一些新的特性,这对HTML 5也不例外.为了仅仅通过HTML提高用户交互,HTML 5已经提供了很多新的API. 是不是非常有趣呢?并且HTML 5已经和CSS 3结合的非常棒了. 因此,我也开始写一系列与HTML 5的API相关的文章来介绍AP

使用 MVVMLight 消息通知

欢迎阅读我的MVVMLight教程系列文章<关于 MVVMLight 设计模式系列> 在文章的其实我们就说了,MVVMLight的精华就是消息通知机制,设计的非常不错.这个东西在MVVMLight可以说是用的及其的频繁,当 ViewModel请求View要有些改变的时候(比如弹个窗体)那么你在ViewModel里面编写弹窗的代码?那也就违背了MVVM的设计模式 啦,MVVMLight的消息通知可以实现互相调用代码而不耦合! 如何使用 MVVMLight 消息通知 接着我们上一篇文章的项目,也说

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

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

消息通信机制NSNotificationCenter -备

消息通信机制NSNotificationCenter的学习.最近写程序需要用到这类,研究了下,现把成果和 NSNotificationCenter是专门供程序中不同类间的消息通信而设置的,使用起来极为方便, 长话短说. 设置通知,就是说要在什么地方(哪个类)接受通知,一般在初始化中做. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test:) name:@"test" object:

通知机制(NSNotification)

a.通知的发布 b.通知的监听 c.通知的移除 NSNotificationCenter:发布通知 监听通知 一个完整的通知一般包含三个属性: 1)-(NSString *)name; //通知的名称 2)-(id)object; //通知发布者(谁要发布通知) 3)-(NSDictionary *)userInfo; //一些额外的信息(通知发布者传递给通知接受者的信息内容) 初始化一个通知对象 ?+ (instancetype)notificationWithName:(NSString*)

NSNotificationCenter 通知机制

在cocoa透彻 框架中,观察者模式的具体应用有两个通知机制和kvo机制 1.通知机制  与委托机制不同的是,前者是“一对多”的对象 之间的通信,后者是“一对一”的对象之间的通信. 通知机制的可以1对多个控制器,1个控制器监听,其他控制器发出请求 . 监听 [[NSNotificationCenter defaultCenter] addObserver:self                                             selector:@selector(han

(总结)高并发消息队列常用通知机制

最近在研究一个高性能的无锁共享内存消息队列,使用的fifo来通知.结合之前<基于管道通知的百万并发长连接server模型>文章,这里总结一下常用的通知机制. 常用的通知机制中比较典型的有以下几种: 1.signal 这种机制下,我们向被通知进程发送一个特殊的signal(比如SIGUSR1),这样正在睡眠的读进程就会被信号中断,然后醒来. 该方法的优点是:读进程不需要监听一个额外的eventfd,适合一些不方便使用eventfd的场景:另外,用户可以选择是使用实时信号(SIGRTMIN+1),