iOS高级面试之NSNotificationCenter是同步操作还是异步操作
转载:http://blog.csdn.net/u014220518/article/details/70598063
:http://blog.csdn.net/intheair100/article/details/46422435
前言
最近有个小伙伴到喜马拉雅去面试,面试官问他一个问题就是“通知中心是同步操作还是异步操作?”,小伙伴回答成异步了,然后就是回家等消息,然后就是没有然后了。。。
我先举几个小的列子给大家瞅瞅:
发送通知
- - (void)sentValueBtnClick:(UIButton *)button{
- NSLog(@"发送通知");
- NSDictionary *dict = @{@"myValue":@"ZFJ通知传值"};
- [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"KPassValue" object:nil userInfo:dict]];
- }
接收通知
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Do any additional setup after loading the view, typically from a nib.
- _textField.layer.borderColor = [UIColor redColor].CGColor;
- _textField.layer.borderWidth = 1.0;
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(passValue:) name:@"KPassValue" object:nil];
- }
- - (void)passValue:(NSNotification *)text{
- NSString *valueStr = text.userInfo[@"myValue"];
- NSLog(@"收到值:%@",valueStr);
- sleep(3);
- self.textField.text = valueStr;
- NSLog(@"通知赋值完毕");
- }
打印结果:
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秒,程序才会继续往下执行,也就是说这个过程是同步的;我认为这里面设计为同步,是考虑到这一点,那就是一个通知可能有多个监听者,采用同步的方式能够保证所有的观察者都能够对通知做出相应,不会遗漏。
异步操作
如果我们想异步操作怎么办呢?莫急且看下面:
发送通知:
- - (void)sentValueBtnClick:(UIButton *)button{
- NSLog(@"发送通知");
- NSDictionary *dict = @{@"myValue":@"ZFJ通知传值"};
- dispatch_async(dispatch_get_global_queue(0, 0), ^{
- [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"KPassValue" object:nil userInfo:dict]];
- });
- }
接受通知:
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Do any additional setup after loading the view, typically from a nib.
- _textField.layer.borderColor = [UIColor redColor].CGColor;
- _textField.layer.borderWidth = 1.0;
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(passValue:) name:@"KPassValue" object:nil];
- }
- - (void)passValue:(NSNotification *)text{
- NSString *valueStr = text.userInfo[@"myValue"];
- NSLog(@"收到值:%@",valueStr);
- dispatch_async(dispatch_get_global_queue(0, 0), ^{
- sleep(3);
- self.textField.text = valueStr;
- NSLog(@"通知赋值完毕");
- });
- }
与javascript中的事件机制不同,ios里的事件广播机制是同步的,默认情况下,广播一个通知,会阻塞后面的代码:
- -(void) clicked
- {
- NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
- [center postNotificationName:@"event_happend" object:self];
- NSLog(@"all handler done");
- }
按下按钮后,发送一个广播,此前已经注册了2个此事件的侦听者
- -(id) init
- {
- self = [super init];
- if(self){
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(whenReceive:) name:@"event_happend" object:nil];
- }
- return self;
- }
- -(void) whenReceive:(NSNotification*) notification
- {
- NSLog(@"im1111");
- }
- -(id) init
- {
- self = [super init];
- if(self){
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(whenReceive:) name:@"event_happend" object:nil];
- }
- return self;
- }
- -(void) whenReceive:(NSNotification*) notification
- {
- NSLog(@"im22222");
- }
执行这段代码,首先会输出im1111,然后是im22222,最后才是all handler done。调试发现,代码始终是跑在同一个线程中(广播事件的线程),广播事件之后的代码被阻塞,直到所有的侦听者都执行完响应
所以,由于NotificationCenter的这个特性,如果希望广播的事件异步处理,则需要在侦听者的方法里开启新线程。应该把Notification作为组件间解耦的方式,而不是利用它来实现异步处理。
iOS高级面试之NSNotificationCenter是同步操作还是异步操作相关推荐
- iOS高级面试之NSRunLoop须知
参考:http://blog.csdn.net/agonie201218/article/details/51115677 https://www.jianshu.com/p/edbe946c8a11 ...
- 【iOS高级资深工程师面试篇】⑪、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 算法部分 字符串反转-链表反转-有序数组组合-Hash算法-查找两个子视图的共同父视图
iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...
- 【iOS高级资深工程师面试篇】①、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 UI部分2/3 -图像显示原理-UI卡顿掉帧
iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...
- 【iOS高级资深工程师面试篇】⑫、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 第三方库部分 AFNetworking-SDWebImageView-ReactiveCocoa
iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...
- 【iOS高级资深工程师面试篇】①、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 UI部分3/3 -UIView绘制原理-离屏渲染
iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...
- 【iOS高级资深工程师面试篇】②、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 Objective-C语言特性部分1/2 分类-关联对象-扩展-代理
iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...
- 【iOS高级资深工程师面试篇】④、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 内存管理部分2/2 引用计数-弱引用-自动释放池-循环引用
iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...
- 最新2022【iOS开发面试真题】初级,中级,高级
前言: 我是一名开发者,一个iOS交流圈子的维护者,对于程序员来说,要学习的知识内容.技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们! 标语:不要浪费 ...
- 2020年中高级iOS大厂面试宝典+答案
前言 过年之后相信有一部分的人,早已磨刀霍霍向大厂.势必要大展拳脚,必将在大厂内创出一片天地.但是,想必大家都知道:最近几年的最严重的互联网寒冬来临,各位兄弟都会说**"江湖再见" ...
最新文章
- 人工智能:第一章 绪 论
- redis常用命令_Redis的简介以及基本常用命令
- 单例模式讨论篇:单例模式与垃圾回收
- 30个实用的 Photoshop 动作《免费下载》
- 远程会议总卡顿?8 个“小白”办法一看就会!
- 【2018-2019-1】20165223-20165218 实验二 固件程序设计
- C#之获取网卡IP地址
- 【微信技术-微信小程序】------ 使用ColorUI组件简单入门
- Android混淆和加固详解
- 《C++ Primer 第5版》-12.2动态数组-康奈尔笔记
- Unity商店下载的文件保存路径
- mysql deadlock found_MySQL遇到Deadlock found when trying to get lock,解决方案
- possible formatting directive
- auto.js朋友圈克隆 截图 上传数据
- 关于vc隐藏浏览器控件 2010-9-7 16:07
- 微信分享到朋友圈的链接,内容打开正常,但在微信中分享时封面缩略图图像和标题显示不出来?...
- python日本 老龄化分析_中国离老龄化社会还有多远?数据图表源代码一览
- Wi-Fi 网络结构
- 扫描版PDF文件,如何弄成可复制的文字版?
- 2021筠连中学高考成绩查询,2021年筠连县中学升学率高不高?
热门文章
- RocketMQ的原理与实践
- 《Java编程思想》读书笔记 第十三章 字符串
- sql语句遇到错误: The used SELECT statements have a different number of columns :
- LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android
- werkzeug中服务器处理请求的实现
- 使用varnish + nginx + lua搭建网站的降级系统
- Oracle 基础之数据库管理
- iOS 四种保存数据的方式!
- 双机热备+Win2003下集群案例
- BZOJ2298 [HAOI2011]problem a 【dp】