美文网首页
27NSNotificationCenter的同步和异步

27NSNotificationCenter的同步和异步

作者: i爱吃土豆的猫 | 来源:发表于2017-10-14 21:52 被阅读18次
  • (void)viewDidLoad {
    [super viewDidLoad];

      UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
      [button setFrame:CGRectMake(0, 100, 400, 60)];
      [button addTarget:self action:@selector(buttonDown) forControlEvents:UIControlEventTouchUpInside];
      [button setTitle:@"Post Notification" forState:UIControlStateNormal];
      [self.view addSubview:button];
    
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(actionNotification:)
                                               name:@"kNotificationName" object:nil];
    

    }

接收通知

- (void) actionNotification: (NSNotification*)notification
{
   NSString* message = notification.object;
   NSLog(@"%@",message);

  //sleep(5);
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
    sleep(5);     
});
NSLog(@"Action Notification Finish")    
 }

同步接收

//- (void)buttonDown{
//    [[NSNotificationCenter defaultCenter] postNotificationName:@"kNotificationName" object:@"object"];

//    NSLog(@"buttonDown");
//}

//异步子线程接收

- (void)buttonDown
{
NSNotification *notification = [NSNotification notificationWithName:@"kNotificationName"
                                                             object:@"object"];
[[NSNotificationQueue defaultQueue] enqueueNotification:notification
                                           postingStyle:NSPostASAP];

//[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationName object:@"object"];

    NSLog(@"buttonDown"); 
 }

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

异步处理:
方法一:
让通知事件处理方法在子线程中执行,例如:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(5);
});

就不会造成阻塞;

方法二:
您可以通过NSNotificationQueue的enqueueNotification:postingStyle:和enqueueNotification:postingStyle:coalesceMask:forModes:方法将通告放入队列,实现异步发送,在把通告放入队列之后,这些方法会立即将控制权返回给调用对象。
我们修改button事件如下:

- (void)buttonDown  
{  
NSNotification *notification = [NSNotification notificationWithName:kNotificationName  
                                                             object:@"object"];  
[[NSNotificationQueue defaultQueue] enqueueNotification:notification  
                                           postingStyle:NSPostASAP];  
  
//    [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationName object:@"object"];  
  
NSLog(@"buttonDown");     
} 

通过这里的时间间隔可以看出, 通过通知队列来管理通知,不会再造成阻塞。

相关文章

  • 27NSNotificationCenter的同步和异步

    (void)viewDidLoad {[super viewDidLoad]; UIButton *button...

  • UNIX 的5种IO模型介绍

    IO模型同步、异步、阻塞、非阻塞socket阻塞与非阻塞,同步与异步 同步和异步 同步/异步主要针对C端-同步就像...

  • 📕 史上最实用的JS笔记

    1. 同步与异步 同步和异步的区别是什么?分别举一个同步和异步的例子 同步会阻塞代码执行,而异步不会阻塞代码执行。...

  • Java AIO基础

    Java AIO(异步IO)特性是在Java7引入的。 [TOC] 同步异步、阻塞非阻塞的理解 同步和异步 同步和...

  • 阻塞、非阻塞、异步、同步

    异步和同步 异步和同步关心的是消息通信机制(synchronous communication / asynchr...

  • JS 函数的执行时机

    1.同步和异步的区别 我们都知道JS里面有同步和异步的区别,怎么理解同步和异步呢。一家餐厅吧来了5个客人,同步的意...

  • 多线程-相关概念

    一.同步(Synchronous)和异步(Asynchronous) 同步和异步通常用来形容一次方法调用,同步方法...

  • I/O模型

    在学习I/O模型前,我们首先介绍同步和异步、阻塞和非阻塞的概念 1. 同步和异步 同步和异步是针对应用程序和内核的...

  • 2017年12月10日daliy

    ## 同步 异步 同步和异步关注的是消息通信机制(synchronous communication/ async...

  • ES6 Promise 异步1

    - 异步 和 同步 promise对象: 用同步方式书写异步代码 promise 让异步写起来,像写同步一样流程...

网友评论

      本文标题:27NSNotificationCenter的同步和异步

      本文链接:https://www.haomeiwen.com/subject/zzifuxtx.html