通知中心的特点:

1:同步执行

2: 一对多发送消息

3: 降低程序耦合度

通知中心是单例,目的就是从任意一个发送消息到任意一个接收者,是同步执行的。

那么什么是同步呢?

用网上经典的说法,就是我叫朋友去吃饭,如果他没来,我就继续叫,等到他出来了我们才一起去吃,这就是同步;如果我叫朋友去吃饭,叫完无论他有没有来,我都先去吃饭,

这就是异步;在通知中心里就是每发送一次消息,要等消息被接收并完全执行完里面的方法,然后才返回来发送第二条消息,这就是同步,即通知中心发送消息是一条一条发送,而且是上条消息执行完才执行下一条的。

NSNotificationCenter的使用:
步骤主要有三个:注册通知、发送广播、销毁广播   另外还有创建通知

默认都是用defaultCenter,而通知不需要时可省略

先介绍一下声明方法:

创建一个通知的方法:

第一种方法三个参数:name:通知名称   object:标识(nullable id类型)  userInfo:字典类型,传值用

object这个参数要注意一下,其实这个参数不是用来传值的,如果要传值,就用userInfo,而object的作用是用来指定收发对象的,即接收端过滤广播用的,不使用时用nil

NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"cen",@"ter", nil];

[NSNotification notificationWithName:@"center" object:@"center2" userInfo:dic];

第二种两个参数,object不是传值用,同上

[NSNotification notificationWithName:@"center" object:nil];//不带标识
//对比:
[NSNotification notificationWithName:@"center" object:@"center1"];//带标识

添加观察者,注册通知

第一种方法 参数1:发生通知的对象;参数2:方法;参数3:通知的名称;参数4:标示(同前)

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

第二种方法 参数1:通知名称,参数2:标识,参数3:队列,参数4:block[跟方法1的区别是使用了block和队列]

[[NSNotificationCenter defaultCenter]addObserverForName:@"ocenter" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {

    }];

发送广播

第一种 参数类型是notification  直接把通知对象发送出去

[[NSNotificationCenter defaultCenter]postNotification:self.notification];

第二种 参数跟以前的一样

[[NSNotificationCenter defaultCenter]postNotificationName:@"center" object:nil userInfo:dic];

第三种

[[NSNotificationCenter defaultCenter]postNotificationName:@"center" object:nil];

销毁广播

第一种 通过广播名字来销毁广播

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

第二种 通过广播对象销毁广播  这里注意如果不使用详细的对象来销毁的话,那尽量避免使用这个方法来销毁广播,假如self是控制器,那可能连系统自己注册的

其它通知也被一起销毁了,除非连同系统那部分也都不要了,就可用self

[[NSNotificationCenter defaultCenter]removeObserver:self.notification];

举个例子:

第一步:创建通知

声明方式

@property(nonatomic,strong)NSNotification *notification;

NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"cen",@"ter", nil];

self.cnotification = [NSNotification notificationWithName:@"center" object:@"user" userInfo:dic];

第二步:注册通知

接收方的控制器里 监听name为center的通知,可在多个控制器里注册通知,而通知中心不用知道接收方是什么,接收方也可接收,这就可以降低程序的耦合度

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

这里就用到object的过滤效果,假如上面创建了多个通知名字都为center,那么在接收的时候就可以用object过滤

-(void)tion:(NSNotification *)notification{

    if ([notification.object isEqualToString:@"user"]) {
NSLog(@"this's notification is center");
}
}

第三步:发送广播

做个循环发送的广播

这里用从创建通知的地方用定时器发送通知

[NSTimer scheduledTimerWithTimeInterval: target:self selector:@selector(post) userInfo:nil repeats:YES];
-(void)post
{
[[NSNotificationCenter defaultCenter]postNotification:self.notification];
}

如果创建多个post发送广播的话,可添加对应的方法来验证通知中心的一对多和通知中心的同步性,通知中心每发送一个广播之后会等待注册通知里的方法(如例子里的tion方法)执行完才会发送下一条广播,无论该方法的执行时间有多长,在没有引入多线程的时候,按发送的广播先后顺序执行,先发送的先执行,跟注册通知的创建先后顺序没有关

系,当然接收端必须已经实例化才能接收;如果引入了多线程发送消息,那就得看线程里谁先被发送了,当然也是先发送的先执行,

第四步:最后是销毁,例如

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

简化使用时,可用2、3、4步即可,例子就需要修改,可以根据需要从注册里添加object,和发送的通知里带信息

这里还涉及到观察者的注册和销毁问题

观察者的创建和销毁要成对存在,一次添加对应一次销毁

创建的位置如   viewWillAppear  和  viewDidAppear, 销毁的位置如   viewWillDisappear 、viewDidDisappear  和 dealloc

就是在页面出现的时候注册通知,页面消失时移除通知。一定要成双成对出现,如果你只在viewWillAppear 中 addObserver没有在viewWillDisappear 中 removeObserver那么当消息发生的时候,你的方法会被调用多次。

当然详细的还是根据需要的来进行修改,如有些通知是在整个工程里用到,创建在appDelegate里,如果通知中心在其他地方有需要用到而不用马上销毁时,使用完成时再进行

销毁,从实际情况确定。

NSNotificationCenter就到这了,如果有地方说得不对的话,欢迎大家指出

iOS NSNotificationCenter详解的更多相关文章

  1. 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)

    转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...

  2. IOS SDK详解

    来源:http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html?page=1#42803301 博客专栏>移动开发专栏>I ...

  3. iOS路由详解

    本文如题,路由详解,注定是一篇详细解释iOS路由原理及使用的文章,由于此时正在外地出差,无法详细一一写出,只能不定时的补充. 一.什么是iOS路由 路由一词来源于路由器,可以实现层级之间消息转发的功能 ...

  4. IOS 手势详解

    在IOS中手势可以让用户有很好的体验,因此我们有必要去了解一下手势. (在设置手势是有很多值得注意的地方) *是需要设置为Yes的点击无法响应* *要把手势添加到所需点击的View,否则无法响应* 手 ...

  5. IOS SizeClasses 详解

    SizeClasses 详解 iOS 8在应用界面的可视化设计上添加了一个新的特性-Size Classes.对于任何设备来说,界面的宽度和高度都只分为三种描述:紧凑,任意和宽松.这样开发者便可以无视 ...

  6. iOS模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    Write in the first[写在最前] 对于从事 iOS 开发人员来说,当提到 ** runtime时,我想都可以说出来 「runtime 运行时」和基本使用的方法.相信很多开发者跟我当初一 ...

  7. iOS 模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    引导 Copyright © PBwaterln Unauthorized shall not be *copy reprinted* . 对于从事 iOS 开发人员来说,所有的人都会答出「runti ...

  8. ios学习--详解IPhone动画效果类型及实现方法

    详解IPhone动画效果类型及实现方法是本文要介绍的内容,主要介绍了iphone中动画的实现方法,不多说,我们一起来看内容. 实现iphone漂亮的动画效果主要有两种方法,一种是UIView层面的,一 ...

  9. iOS - AVAudioSession详解

    音频输出作为硬件资源,对于iOS系统来说是唯一的,那么要如何协调和各个App之间对这个稀缺的硬件持有关系呢? iOS给出的解决方案是"AVAudioSession" ,通过它可以实 ...

随机推荐

  1. 2015微软MVP全球峰会见闻

    2015.10.31-2015.11.8 一周的时间完成微软MVP全球峰会旅程,这一周在不断的倒时差,行程安排非常的紧张,还好和大家请假了没有更新微信公众号,今天开始继续更新微信公众号,开始新的旅程, ...

  2. 【腾讯Bugly干货分享】WebVR如此近-three.js的WebVR示例解析

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ff1689a6c9121b1adb16 作者:苏晏烨 关于WebVR 最 ...

  3. opengl 笔记(2)

    /*- * Opengl Demo Test * * Fredric : 2016-7-10 */ #include <GLUT/GLUT.h> #include <stdlib.h ...

  4. 【Java并发编程实战】-----“J.U.C”:Exchanger

    前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...

  5. CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL

    CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL +BIT祝威+悄悄在此留下版了个权的信息说: 开始 本文用step by step的方式,讲述如何使 ...

  6. Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 用”模型定义”函数过滤实体集

    11-2. 用”模型定义”函数过滤实体集 问题 想要创建一个”模型定义”函数来过滤一个实体集 解决方案 假设我们已有一个客户(Customer)和票据Invoice)模型,如Figure 11-2所示 ...

  7. python装饰器

    今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...

  8. Fiddler--一、HTTP协议简介

    在学习Fiddler之前,最好先学习一下HTTP协议. HTTP协议简介 什么是HTTP协议 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端 ...

  9. VS2015企业版本(安装包+key)+ .NET Reflector 9.0

    Reflector9.0系下载:https://yunpan.cn/cMQj9zWbffSqy  访问密码 55eb VS2015中文企业版: http://pan.baidu.com/s/1eRIo ...

  10. Redis数据结构详解之List(二)

    序言 思来想去感觉redis中的list没什么好写的,如果单写几个命令的操作过于乏味,所以本篇最后我会根据redis中list数据类型的特殊属性,同时对比成熟的消息队列产品rabbitmq,使用red ...