iOS通知

一.通知

对于通知,大家想必都不陌生,它是一个单例,允许当事件发生时通知一些对象,让我们在低程度耦合的情况下,来达到通信的目的。

通知的优势:

1.不需要编写太多代码,实现比较简单

2.对于一个发出的通知,可以多个对象作出反应,即是说通知是一对多的形式

通知的缺点:

1.在编译期不会检查通知是否能够被观察者正确处理

2.在释放注册的对象时,需要在通知中心取消注册

3.在调试应用时,难以跟踪程序

4.发出通知后,不能够从观察者那里获取任何反馈信息

通知的基本实现:

- (void)viewDidLoad {

[super viewDidLoad];

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

NSLog(@"注册通知 - %@",[NSThread currentThread]);

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

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

NSLog(@"发送通知完成 - %@",[NSThread currentThread]);

}

- (void)test {

NSLog(@"接收到通知 - %@",[NSThread currentThread]);

sleep(3);

}

打印结果:

2017-06-13 16:53:01.040 通知的基本使用[24531:3283934] 注册通知 - {number = 1, name = main}

2017-06-13 16:53:10.334 通知的基本使用[24531:3283934] 接收到通知 - {number = 1, name = main}

2017-06-13 16:53:13.335 通知的基本使用[24531:3283934] 发送通知完成 - {number = 1, name = main}

注意打印结果:在test方法执行完毕之后,才会打印发送完成的log。

如果在子线程发送通知:

- (void)viewDidLoad {

[super viewDidLoad];

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

NSLog(@"注册通知 - %@",[NSThread currentThread]);

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

NSNotification *notification = [NSNotification notificationWithName:@"test"

object:nil];

// NSPostASAP是接收不到通知的 要使用NSPostNow

[[NSNotificationQueue defaultQueue] enqueueNotification:notification postingStyle:NSPostNow];

NSLog(@"发送通知完成 - %@",[NSThread currentThread]);

});

}

- (void)test {

NSLog(@"接收到通知 - %@",[NSThread currentThread]);

sleep(3);

}

打印结果:

2017-06-13 17:05:01.133 通知的基本使用[25191:3296062] 注册通知 - {number = 1, name = main}

2017-06-13 17:05:02.423 通知的基本使用[25191:3296125] 接收到通知 - {number = 3, name = (null)}

2017-06-13 17:05:05.523 通知的基本使用[25191:3296125] 发送通知完成 - {number = 3, name = (null)}

得出结论:接收通知的线程和发送通知的线程是一样的,如果在实际开发过程中,我们是在子线程中发送通知的,在接收到通知之后,需要刷新UI等操作,一定要回到主线程。

- (void)viewDidLoad {

[super viewDidLoad];

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

NSLog(@"接收到通知 - %@",[NSThread currentThread]);

sleep(3);

}];

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

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

NSLog(@"发送通知完成 - %@",[NSThread currentThread]);

});

}

打印结果:

2017-06-13 18:21:38.367 通知的基本使用[29365:3382047] 接收到通知 - {number = 1, name = main}

2017-06-13 18:21:41.368 通知的基本使用[29365:3382100] 发送通知完成 - {number = 3, name = (null)}

得出结论:使用NSOperationQueue可以让接收通知的线程和发送通知的线程不一样,让接收通知的线程在主线程,就可以刷新UI等操作了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS 提供了一种 “同步的” 消息通知机制NSNotificationCenter,观察者只要向消息中心注册, ...
    MasterChen阅读 2,271评论 4 16
  • 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案...
    张战威ican阅读 633评论 0 0
  • 概述 这篇文章中,我不会说多线程是什么、线程和进程的区别、多线程有什么用,当然我也不会说什么是串行、什么是并行等问...
    hashakey阅读 314评论 0 0
  • 和菜头在公号里说,《寻梦环游记》是今年唯一值得推荐的电影。家里对动画片无感的人说,不少认识的人去看了,都说好。本来...
    罗德岛阅读 492评论 0 0
  • 最近因为搬了新家添置了很多东西,都是些必需品,冰箱、洗衣机、单人沙发,还有很多日常用品,为了上班不挤公交车又买了个...
    橘子姑娘_阅读 384评论 0 1