转载:http://blog.csdn.net/u014220518/article/details/70598063

:http://blog.csdn.net/intheair100/article/details/46422435

前言

最近有个小伙伴到喜马拉雅去面试,面试官问他一个问题就是“通知中心是同步操作还是异步操作?”,小伙伴回答成异步了,然后就是回家等消息,然后就是没有然后了。。。

我先举几个小的列子给大家瞅瞅:

发送通知

[objc] view plaincopy
  1. - (void)sentValueBtnClick:(UIButton *)button{
  2. NSLog(@"发送通知");
  3. NSDictionary *dict = @{@"myValue":@"ZFJ通知传值"};
  4. [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"KPassValue" object:nil userInfo:dict]];
  5. }

接收通知

[objc] view plaincopy
  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. // Do any additional setup after loading the view, typically from a nib.
  4. _textField.layer.borderColor = [UIColor redColor].CGColor;
  5. _textField.layer.borderWidth = 1.0;
  6. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(passValue:) name:@"KPassValue" object:nil];
  7. }
  8. - (void)passValue:(NSNotification *)text{
  9. NSString *valueStr = text.userInfo[@"myValue"];
  10. NSLog(@"收到值:%@",valueStr);
  11. sleep(3);
  12. self.textField.text = valueStr;
  13. NSLog(@"通知赋值完毕");
  14. }

打印结果:

2017-04-24 14:36:42.043 NSNotification[8150:145628] 发送通知

2017-04-24 14:36:42.043 NSNotification[8150:145628] 收到值:ZFJ通知传值

2017-04-24 14:36:45.044 NSNotification[8150:145628] 通知赋值完毕

案例分析

通过打印我们可以看出,当我们发送通知以后,观察者在接收到值以后,我们休眠3秒,程序才会继续往下执行,也就是说这个过程是同步的;我认为这里面设计为同步,是考虑到这一点,那就是一个通知可能有多个监听者,采用同步的方式能够保证所有的观察者都能够对通知做出相应,不会遗漏。

异步操作

如果我们想异步操作怎么办呢?莫急且看下面:

发送通知:

[objc] view plaincopy
  1. - (void)sentValueBtnClick:(UIButton *)button{
  2. NSLog(@"发送通知");
  3. NSDictionary *dict = @{@"myValue":@"ZFJ通知传值"};
  4. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  5. [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"KPassValue" object:nil userInfo:dict]];
  6. });
  7. }

接受通知:

[objc] view plaincopy
  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. // Do any additional setup after loading the view, typically from a nib.
  4. _textField.layer.borderColor = [UIColor redColor].CGColor;
  5. _textField.layer.borderWidth = 1.0;
  6. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(passValue:) name:@"KPassValue" object:nil];
  7. }
  8. - (void)passValue:(NSNotification *)text{
  9. NSString *valueStr = text.userInfo[@"myValue"];
  10. NSLog(@"收到值:%@",valueStr);
  11. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  12. sleep(3);
  13. self.textField.text = valueStr;
  14. NSLog(@"通知赋值完毕");
  15. });
  16. }

与javascript中的事件机制不同,ios里的事件广播机制是同步的,默认情况下,广播一个通知,会阻塞后面的代码:

Objc代码  
  1. -(void) clicked
  2. {
  3. NSNotificationCenter *center =  [NSNotificationCenter defaultCenter];
  4. [center postNotificationName:@"event_happend" object:self];
  5. NSLog(@"all handler done");
  6. }

按下按钮后,发送一个广播,此前已经注册了2个此事件的侦听者

Objc代码  
  1. -(id) init
  2. {
  3. self = [super init];
  4. if(self){
  5. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(whenReceive:) name:@"event_happend" object:nil];
  6. }
  7. return self;
  8. }
  9. -(void) whenReceive:(NSNotification*) notification
  10. {
  11. NSLog(@"im1111");
  12. }
Objc代码  
  1. -(id) init
  2. {
  3. self = [super init];
  4. if(self){
  5. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(whenReceive:) name:@"event_happend" object:nil];
  6. }
  7. return self;
  8. }
  9. -(void) whenReceive:(NSNotification*) notification
  10. {
  11. NSLog(@"im22222");
  12. }

执行这段代码,首先会输出im1111,然后是im22222,最后才是all handler done。调试发现,代码始终是跑在同一个线程中(广播事件的线程),广播事件之后的代码被阻塞,直到所有的侦听者都执行完响应

所以,由于NotificationCenter的这个特性,如果希望广播的事件异步处理,则需要在侦听者的方法里开启新线程。应该把Notification作为组件间解耦的方式,而不是利用它来实现异步处理。

iOS高级面试之NSNotificationCenter是同步操作还是异步操作相关推荐

  1. iOS高级面试之NSRunLoop须知

    参考:http://blog.csdn.net/agonie201218/article/details/51115677 https://www.jianshu.com/p/edbe946c8a11 ...

  2. 【iOS高级资深工程师面试篇】⑪、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 算法部分 字符串反转-链表反转-有序数组组合-Hash算法-查找两个子视图的共同父视图

    iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...

  3. 【iOS高级资深工程师面试篇】①、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 UI部分2/3 -图像显示原理-UI卡顿掉帧

    iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...

  4. 【iOS高级资深工程师面试篇】⑫、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 第三方库部分 AFNetworking-SDWebImageView-ReactiveCocoa

    iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...

  5. 【iOS高级资深工程师面试篇】①、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 UI部分3/3 -UIView绘制原理-离屏渲染

    iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...

  6. 【iOS高级资深工程师面试篇】②、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 Objective-C语言特性部分1/2 分类-关联对象-扩展-代理

    iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...

  7. 【iOS高级资深工程师面试篇】④、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 内存管理部分2/2 引用计数-弱引用-自动释放池-循环引用

    iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...

  8. 最新2022【iOS开发面试真题】初级,中级,高级

    前言: 我是一名开发者,一个iOS交流圈子的维护者,对于程序员来说,要学习的知识内容.技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们! 标语:不要浪费 ...

  9. 2020年中高级iOS大厂面试宝典+答案

    前言 过年之后相信有一部分的人,早已磨刀霍霍向大厂.势必要大展拳脚,必将在大厂内创出一片天地.但是,想必大家都知道:最近几年的最严重的互联网寒冬来临,各位兄弟都会说**"江湖再见" ...

最新文章

  1. 人工智能:第一章 绪 论
  2. redis常用命令_Redis的简介以及基本常用命令
  3. 单例模式讨论篇:单例模式与垃圾回收
  4. 30个实用的 Photoshop 动作《免费下载》
  5. 远程会议总卡顿?8 个“小白”办法一看就会!
  6. 【2018-2019-1】20165223-20165218 实验二 固件程序设计
  7. C#之获取网卡IP地址
  8. 【微信技术-微信小程序】------ 使用ColorUI组件简单入门
  9. Android混淆和加固详解
  10. 《C++ Primer 第5版》-12.2动态数组-康奈尔笔记
  11. Unity商店下载的文件保存路径
  12. mysql deadlock found_MySQL遇到Deadlock found when trying to get lock,解决方案
  13. possible formatting directive
  14. auto.js朋友圈克隆 截图 上传数据
  15. 关于vc隐藏浏览器控件 2010-9-7 16:07
  16. 微信分享到朋友圈的链接,内容打开正常,但在微信中分享时封面缩略图图像和标题显示不出来?...
  17. python日本 老龄化分析_中国离老龄化社会还有多远?数据图表源代码一览
  18. Wi-Fi 网络结构
  19. 扫描版PDF文件,如何弄成可复制的文字版?
  20. 2021筠连中学高考成绩查询,2021年筠连县中学升学率高不高?

热门文章

  1. RocketMQ的原理与实践
  2. 《Java编程思想》读书笔记 第十三章 字符串
  3. sql语句遇到错误: The used SELECT statements have a different number of columns :
  4. LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android
  5. werkzeug中服务器处理请求的实现
  6. 使用varnish + nginx + lua搭建网站的降级系统
  7. Oracle 基础之数据库管理
  8. iOS 四种保存数据的方式!
  9. 双机热备+Win2003下集群案例
  10. BZOJ2298 [HAOI2011]problem a 【dp】