码迷,mamicode.com
首页 > 移动开发 > 详细

测试iOS的Notification是同步还是异步

时间:2018-04-27 23:02:37      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:ESS   UI   ica   通过   inf   nsstring   tno   orm   action   

面试被问到这个问题,不是很清楚,写代码测试并记录一下。

#pragma mark - 测试通知
-(void)testNotification
{
    // 初始化一个按钮
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 50)];
    button.backgroundColor = [UIColor orangeColor];
    [button setTitle:@"触发通知" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonDown) forControlEvents:UIControlEventTouchUpInside];
    [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:%@",message);
    
    sleep(3);   // 睡3秒
    NSLog(@"通知说话结束");
}

- (void)buttonDown
{
    [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationName object:@"通知说话开始"];
    NSLog(@"按钮说话");
}

点击触发通知按钮后,控制台打印如下:

技术分享图片

通过这里的时间间隔可以看出,通知的过程是同步进行的。

在抛出通知以后,观察者在通知事件处理完成以后(这里我们休眠3秒),抛出者才会往下继续执行,也就是说这个过程默认是同步的;当发送通知时,通知中心会一直等待所有的observer都收到并且处理了通知才会返回到poster;

PS:

如果想改同步为异步,也是有办法的。比如让通知事件处理方法在子线程中执行。

- (void) actionNotification: (NSNotification*)notification
{
//    NSString* message = notification.object;
//    NSLog(@"message:%@",message);
//
//    sleep(3);   // 睡3秒
//    NSLog(@"通知说话结束");
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        NSString* message = notification.object;
        NSLog(@"message:%@",message);
        
        sleep(3);
        
        NSLog(@"通知说话结束:%@",[NSThread currentThread]);
        
    });
}

- (void)buttonDown
{
    [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationName object:@"通知说话开始"];
    NSLog(@"按钮说话:%@",[NSThread currentThread]);
}

此时点击触发通知按钮,控制台打印输入:

技术分享图片

 

测试iOS的Notification是同步还是异步

标签:ESS   UI   ica   通过   inf   nsstring   tno   orm   action   

原文地址:https://www.cnblogs.com/gwfeng/p/8964846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!