iOS NSNotificationCenter通知中心使用小结

前言

最近公司组织两个星期的新人培训,事情安排的满满的,周末都没有。说好的一个星期一更新的博客中断了,让大家久等了,现在培训结束,终于又可以安安静静的做一个程序员了,好开心。。。

一、NSNotification和Delegate的联系和区别

众所周知,IOS中经常会使用到NSNotification和delegate来进行一些类之间的消息传递。言归正传,这两种有什么区别呢?
NSNotification就是IOS提供的一个消息中心,由一个全局的defaultNotification管理应用中的消息机制。通过公开的API可以看出,这里面使用了是一个观察者,通过注册addObserver和解除注册removeObserver来实现消息传递。苹果文档特别提出,在类析构的时候,要记得把removeObserver,不然就会引发崩溃,所以NSNotifcation的使用是没有retain+1的,NSNotification是一对多的。

至于Delegate,很简单,就是通过增加一个指针,然后把需要调用的函数通过delegate传递到其他类中,来得很直截了当。不需要通过广播的形式去实现,但是,delegate的形式只能是一对一,不能实现一对多。

在什么情况下使用Delegate和NSNotifiation呢?

从效率上看Delegate是一个很轻量级的,相对delegate,NSNotification却是一个很重量级的,效率上delegate明显要比Noticication高。一般情况我们会这样使用。

场景一:

A拥有B,然后B中的一些操作需要回调到A中,这时候就简单的通过delegate回调到A。因为B是A创建的,B可以很直接的把delegate赋值A。

场景二:

A和B是两个不相干的关系,A不知道B,B也不知道A,那么这时候如果通过delegate就没办法做到,会相对复杂。所以可以通过NSNotifcation去做一些消息传递。

所以使用delegate的情况是两者有直接的关系,至于一方知道另一方的存在。而NSNotifcation一般是大家不知道对方的存在,一般是使用跨模块的时候使用。在使用的时候,使用delegate可能需要多写一些delegate去实现,代码量比较多。NSNotication只要定义相关的NotificationName就可以很方便的沟通。两者各有所长。

二、监听系统自带的NSNotification

系统里定义了许多的 XxxNotification 名称,其实只要 Cmd+Shift+O 打开 Open Quickly,输入 NSNotification 或者 UINotification 可以看到许多以 Notification 结尾的变量定义,由变量名称也能理解在什么时候会激发什么事件,一般都是向 [NSNotificationCenter defaultCenter] 通知的。

使用步骤

第一步:注册系统监听事件

 //在NSNotificationCenter中注册键盘弹出事件
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardUpEvent:) name:UIKeyboardDidShowNotification object:nil];
  //在NSNotificationCenter中注册键盘隐藏事件
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDownEvent:) name:UIKeyboardDidHideNotification object:nil];
  //在NSNotificationCenter中注册程序从后台唤醒事件
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(becomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];

第二步:事件触发后的处理

/**
 * 弹出键盘事件触发处理
 *
 * @param notification
 */
-(void)keyboardUpEvent : (NSNotification *)notification{
  //NSLog(@"键盘弹出事件触发==%@",notification);
  NSLog(@"键盘弹出事件触发");
}

/**
 * 键盘隐藏事件触发处理
 *
 * @param notification
 */
-(void)keyboardDownEvent : (NSNotification *)notification{
  //NSLog(@"键盘隐藏事件触发==%@",notification);
  NSLog(@"键盘隐藏事件触发");
}

/**
 * 程序从后台唤醒触发处理
 *
 * @param notification
 */
-(void)becomeActive: (NSNotification *)notification{
  NSLog(@"程序从后台唤醒触发处理");
}

第三步、在dealloc中解除监听

/**
 *NSNotificationCenter 注意点:每一次在接受者对象中需要delleac把它销毁掉。
 */
-(void)dealloc{
  [[NSNotificationCenter defaultCenter] removeObserver:self];
}

三、自定义NSNotification

这里我使用的一个实例为:在ViewController中定义一个按钮,点击该按钮,同时改变两个自定义View中的内容。

使用步骤

第一步、在ViewController中生成一个按钮,两个自定义View

 UIButton *postMsgBtn = [[UIButton alloc] initWithFrame:CGRectMake(50, 200, 100, 40)];
  [postMsgBtn setTitle:@"发送消息" forState:UIControlStateNormal];
  postMsgBtn.backgroundColor = [UIColor grayColor];
  [postMsgBtn addTarget:self action:@selector(postMsg:) forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:postMsgBtn];

  MyView *view = [[MyView alloc] initWithFrame:CGRectMake(50, 250, 100, 50)];
  [self.view addSubview:view];

  MyView *view2 = [[MyView alloc] initWithFrame:CGRectMake(50, 320, 100, 50)];
  [self.view addSubview:view2];

第二步、点击按钮,发送Notification

-(void)postMsg: (UIButton *)btn{
  [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_MESSAGE_NAME object:nil userInfo:@{@"msg":@"jingming1"}];
}

第三步、在自定义View中注册监听事件

代码如下:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(acceptMsg:) name:NOTIFICATION_MESSAGE_NAME object:nil];

第四步、处理监听事件

-(void)acceptMsg : (NSNotification *)notification{
  NSLog(@"%@",notification);
  NSDictionary *userInfo = notification.userInfo;
  _label.text = [userInfo objectForKey:@"msg"];
}

第五步、在dealloc中解除监听

-(void)dealloc{
  [[NSNotificationCenter defaultCenter] removeObserver:self];
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ios NSNotificationCenter通知的简单使用

    通知类本身比较简单,大概就分为注册通知监听器.发送通知,注销通知监听器三个方法:通知中心(NSNotificationCenter)采用单例的模式,整个系统只有一个通知中心,通过如下代码获取: //获取通知中心 [NSNotificationCenter defaultCenter]: 注册通知监听器方法: //observer为监听器 //aSelector为接到收通知后的处理函数 //aName为监听的通知的名称 //object为接收通知的对象,需要与postNotification的ob

  • iOS NSNotificationCenter通知中心使用小结

    前言 最近公司组织两个星期的新人培训,事情安排的满满的,周末都没有.说好的一个星期一更新的博客中断了,让大家久等了,现在培训结束,终于又可以安安静静的做一个程序员了,好开心... 一.NSNotification和Delegate的联系和区别 众所周知,IOS中经常会使用到NSNotification和delegate来进行一些类之间的消息传递.言归正传,这两种有什么区别呢? NSNotification就是IOS提供的一个消息中心,由一个全局的defaultNotification管理应用中的

  • Swift中通知中心(NotificationCenter)的使用示例

    前言 本文主要介绍了关于Swift通知中心(NotificationCenter)使用的相关内容,NotificationCenter是Swift中一个调度消息通知的类,采用单例模式设计,实现传值.回调等作用. 通知的作用还是挺强大的,对于两个不相关的控制器之间,要进行信息的传递,使用通知是个不错的选择,下面话不多说了,来一起看看详细的使用方法吧. 1.添加通知 /// 通知名 let notificationName = "XMNotification" /// 自定义通知 Noti

  • powershell解决win10开始菜单和通知中心无法打开

    问题描述 笔者用的是现在并不成熟的Win10操作系统,昨天首先就遇到了打开计算器出现闪退的情况,然后我google 找到了一个方案 点击开始菜单,输入"Powershell"在搜索结果中右键单击Powershell,选择"以管理员身份运行"在打开的窗口里面输入以下内容 复制代码 代码如下: Get-AppXPackage -AllUsers | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register &q

  • iOS UIView常见属性方法小结

    下面通过实例代码给大家详细介绍了iOS UIView常见属性方法,具体代码如下所示: UIView : UIResponder /** 通过一个frame来初始化一个UI控件 */ - (id)initWithFrame:(CGRect)frame; // YES:能够跟用户进行交互 @property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled; // default is YES // 控件的一

  • IOS 远程通知兼容(IOS7,IOS8)实例详解

    IOS 远程通知 1.证书推送安装 证书的操作过程我就不说了,网上一大堆,首先我要说一下为什么要这些证书其实就是告诉苹果服务器三点: 1.我们要为哪个应用做推送 2.哪台电脑上做推送调试 3.哪台手机设备上做推送调试 我把调试做了高亮,因为总有人问为什么我要在mac上双击安装cer文件和mobileprovision文件,就是因为你要调试,如果你不调试你可以生成后不安装. 2.代码实现 - (BOOL)application:(UIApplication *)application didFin

  • 简单说说iOS之WKWebView的用法小结

    WKWebView的优势 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷新频率(不卡) 1.Xcode新建My.html文件,自定义html内容,主要代码如下: (1)标签为UI样式(写了简单的JS代码,目的用于讲解交互) (2)onClick为JS事件,当JS想给OC传递参数时,采用如下代码:window.webkit.messageHandlers.<方法名>.post

  • iOS开发之枚举用法小结

    前言 Enum,也就是枚举,从C语言开始就有了,C++.Java.Objective-C.Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个-规范的定义代码中的状态.选项等"常量". 举个例子,我们想要在开发中根据四季的变化做不同的操作,我们首先想到的可能会是定义一个int型变量,通过为该变量赋不同的值来表示四季(e.g. 1为春天,2为夏天,3为秋天,4为冬天).但是,对于阅读该份代码的人来讲,他们并不能在短时间内就明白数字1234所代表的具体含义.这

  • 轻松搞定iOS本地消息推送

    首先,我们先要明白一个概念,这里的本地通知是UILocalNotification类,和系统的NSNotificationCenter通知中心是完全不同的概念. 一.我们可以通过本地通知做什么 通知,实际上是由IOS系统管理的一个功能,比如某些后台应用做了某项活动需要我们处理.已经退出的应用在某个时间提醒我们唤起等等,如果注册了通知,系统都会在通知触发时给我们发送消息.由此,我们可以通过系统给我们的APP添加通知用户的功能,并且应用非常广泛.例如,闹种类应用,有按时签到相似功能的应用.下面,我们

  • iOS中的通知机制

    网上经常说iOS的通知机制是使用了观察者模式,里面有两个角色,其一是poster(发送者),另一个是observer(接受信息的订阅者).但我认为重要的角色是通知中心,它是整个通知机制的核心,有poster发送者发送的消息必定要到达通知中心,再由通知中心根据这个消息被哪些observer订阅者订阅过,就把消息往那些订阅者去分发.整体可以与现在的电子邮件结构作类比的. 但要额外说明一下,iOS的通知虽然也叫Notification通知,但是与Android中的通知是不一样的,在Android中的通

随机推荐