1、NSNotification是同步還是異步?
默認(rèn)情況下拧簸,創(chuàng)建的NSNotification是同步的秒紧,
發(fā)布通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"clickBtn" object:nil];
接收通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(click111) name:@"clickBtn" object:nil];
- (void)click111
{
sleep(3);
NSLog(@"通知執(zhí)行完畢");
}
執(zhí)行結(jié)果
2016-10-14 16:57:50.595 InterviewDemo[8682:2263688] 開始發(fā)布通知
2016-10-14 16:57:53.597 InterviewDemo[8682:2263688] 通知執(zhí)行完畢
2016-10-14 16:57:53.598 InterviewDemo[8682:2263688] 執(zhí)行完畢了通知
通過這里的時間間隔可以看出,在拋出通知以后凛剥,觀察者在通知事件處理完成以后(這里我們休眠3秒),拋出者才會往下繼續(xù)執(zhí)行轻姿,也就是說這個過程默認(rèn)是同步的犁珠;當(dāng)發(fā)送通知時,通知中心會一直等待所有的observer都收到并且處理了通知才會返回到poster互亮;
那能不能當(dāng)成異步處理呢犁享?
兩種方法:
第一種方法,發(fā)布通知的時候搞在子線程中豹休,當(dāng)然了炊昆,接收方法觸發(fā)的也是在子線程中
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"clickBtn" object:nil];
});
第二種方法,接收方法在子線程中執(zhí)行
- (void)click111
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(3);
NSLog(@"通知執(zhí)行完畢");
});
}
2威根、NSNotification和delegate相比有什么區(qū)別
1>NSNotification是一對多的關(guān)系凤巨,不需要兩個之間建立什么聯(lián)系,類似于一種廣播似的發(fā)送消息洛搀,接受者只要是聲明了接收信息敢茁,就能接收。消息接受者通過keyPath的方式指定需要接受的消息類型留美,通常在對象初始化完成以后聲明開始接受消息彰檬,在對象被銷毀前注銷接受消息伸刃。
NSNotification發(fā)布一個廣播的通知。(面向所有的類)逢倍,當(dāng)有誰需要這個通知的話捧颅,就注冊成為它的會員(會員存在Array里)。notification通過管理array來實(shí)現(xiàn)事件的操作较雕。
當(dāng)哪個 會員 什么時候不需要再成為會員的時候碉哑,就需要注銷(在dealloc里釋放)
2>delegate是一對一的關(guān)系,首先兩個要建立聯(lián)系郎笆,才能進(jìn)行相應(yīng)的傳值回調(diào)動作谭梗。
3、效率哪個更高
效率肯定是delegate比NSNotification高宛蚓。