面试必看iOS 坑的集中营iOS学习

NSNotification是同步还是异步?和delegate相

2016-10-14  本文已影响884人  踩坑小分队

1、NSNotification是同步还是异步?
默认情况下,创建的NSNotification是同步的,
发布通知

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

接收通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(click111) name:@"clickBtn" object:nil];
- (void)click111
{
        sleep(3);
        NSLog(@"通知执行完毕");
}

执行结果

2016-10-14 16:57:50.595 InterviewDemo[8682:2263688] 开始发布通知
2016-10-14 16:57:53.597 InterviewDemo[8682:2263688] 通知执行完毕
2016-10-14 16:57:53.598 InterviewDemo[8682:2263688] 执行完毕了通知

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

那能不能当成异步处理呢?
两种方法:
第一种方法,发布通知的时候搞在子线程中,当然了,接收方法触发的也是在子线程中

 dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:@"clickBtn" object:nil];
    });

第二种方法,接收方法在子线程中执行

- (void)click111
{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
    
        sleep(3);
        NSLog(@"通知执行完毕");
    });
}

2、NSNotification和delegate相比有什么区别
1>NSNotification是一对多的关系,不需要两个之间建立什么联系,类似于一种广播似的发送消息,接受者只要是声明了接收信息,就能接收。消息接受者通过keyPath的方式指定需要接受的消息类型,通常在对象初始化完成以后声明开始接受消息,在对象被销毁前注销接受消息。
NSNotification发布一个广播的通知。(面向所有的类),当有谁需要这个通知的话,就注册成为它的会员(会员存在Array里)。notification通过管理array来实现事件的操作。
当哪个 会员 什么时候不需要再成为会员的时候,就需要注销(在dealloc里释放)
2>delegate是一对一的关系,首先两个要建立联系,才能进行相应的传值回调动作。

3、效率哪个更高
效率肯定是delegate比NSNotification高。

上一篇下一篇

猜你喜欢

热点阅读