通知中心的特点:

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:2 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就到这了,如果有地方说得不对的话,欢迎大家指出

转载于:https://www.cnblogs.com/fcug/p/5312224.html

iOS NSNotificationCenter详解相关推荐

  1. FreeEIM 来点新知识iOS UIScrollView详解

     老程序员FreeEIM 来点新知识iOS UIScrollView详解 UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的 ...

  2. iOS绘图详解-多种绘图方式、裁剪、滤镜、移动、CTM

    iOS绘图详解 摘要: Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的 绘 ...

  3. IOS UIView详解

    文章目录 IOS UIView详解 1.官方类分析 2. UIView 常用的属性 2.1 UIView的圆角加阴影效果的实现 2.2 UIView 属性 2.2.1 UIView 几何属性 2.2. ...

  4. iOS疯狂详解之AFNetworking图片缓存问题

    AFNetworking网络库已经提供了很好的图片缓存机制,效率是比较高的,但是我发现没有直接提供清除缓存的功能,可项目通常都需要添加 清除功能的功能,因此,在这里我以UIImageView+AFNe ...

  5. iOS多线程详解:实践篇

    iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI.在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程.由于在iOS中除了主线程,其他子线程是独立 ...

  6. iOS疯狂详解之开源库

    youtube下载神器:https://github.com/rg3/youtube-dl vim插件:https://github.com/Valloric/YouCompleteMe vim插件配 ...

  7. [iOS] 国际化详解

    PS:修改设备系统语言方法 设置 -> 通用 -> 语言与地区 -> iPhone 语言 Settings -> General -> Language & Re ...

  8. UE4 IOS打包详解

    写在前面:因为是详解,所以可能写的有可能啰嗦,也有可能有些步骤是你经历过的,那么请忽略它,向下寻找可能的答案,如果没能解决你的问题,那么对此感到很抱歉,没能帮到你,欢迎你给我邮件: bluecode6 ...

  9. iOS模式详解runtime面试工作

    简书:http://www.jianshu.com/p/19f280afcb24 对于从事 iOS 开发人员来说,所有的人都会答出「runtime 是运行时」,什么情况下用runtime?,大部分人能 ...

最新文章

  1. python函数教程:global 和 nonlocal的详细用法
  2. C语言求一个数是否为armstrong阿姆斯特朗数(附完整源码)
  3. akka案例:统计单词个数
  4. 阿里百川IMSDK--自定义群聊界面
  5. java找出最高工资和下标_Java 8 lambda用于为每个部门选择最高薪资员工
  6. 跟据URL来实现WebService
  7. java提示程序包有问题_如何解决安装java时出现程序包有问题不能运行的问题?...
  8. 24年未遇之奇景再等等 Intel旗舰显卡曝5-6月发布
  9. “天鹅”类谜解大全!-
  10. Python Tkinter Text控件随输入自动拓展到尾行
  11. linux cp批量复制,【linux】cp 批量复制文件
  12. android新闻客户端答辩,头条客户端 Android
  13. 外设键盘的win键和alt键功能互换
  14. 一个很好用的gif动态图控件:GifImageView
  15. MT40A1G16KH-062E AIT内存MT40A1G16KH-062E AUT
  16. CSS简单实现圣杯布局和双飞翼布局
  17. 现代黄河三角洲的冲淤分区及地层特征
  18. SELECT...INTO语法
  19. 2019INFOCOM 边缘计算资源分配,任务调度,服务部署相关工作不完全总结
  20. UKey电子签章:涉密文件轻松签,无需部署、即插即用

热门文章

  1. H264 介绍[1]
  2. String类型的学习
  3. SQL server触发器中 update insert delete 分别给写个例子被。
  4. MySQL(11)数据库实现高可用架构之MMM
  5. zabbix安装php7.0,Centos 7.0安装Zabbix server详细步骤(示例代码)
  6. endnote初始化数据库支持_服务端编程——数据库(MySQL、sequelize) - 天生笑点低你奈我何...
  7. vba 数组赋值_VBA数组与字典解决方案第18讲:VBA中静态数组的定义及创建
  8. P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles(简单dp)
  9. 开放下载! | 《AI时代下的汽车业数字化变革》
  10. 漫画通信:有了它,终于可以放心买买买了