NSNotification通知是同步還是異步?

  • 相信小伙伴們平時(shí)沒怎么注意過通知是同步還是異步,直到在面試的時(shí)候被面試官問的一臉懵逼,才開始思考,yes or not ?
  • 下面我們一起來揭開這個(gè)神秘的面紗:通知到底是同步還是異步?

1.在ViewController.m中創(chuàng)建發(fā)送通知的btn,并注冊(cè)通知

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.backgroundColor = [UIColor greenColor];
    [btn setTitle:@"發(fā)送通知" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
    btn.frame = CGRectMake(100, 100, 80, 30);
    [self.view addSubview:btn];
//   注冊(cè)通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction:) name:@"kNotification" object:nil];
}

2.在btn的按鈕點(diǎn)擊調(diào)用方法中發(fā)送通知:

-(void)btnAction{
//發(fā)送通知,通知內(nèi)容為:通知發(fā)送了
    [[NSNotificationCenter defaultCenter] postNotificationName:@"kNotification" object:@"通知發(fā)送了"];
    [NSThread currentThread];
    NSLog(@"按鈕點(diǎn)擊了");
}

3.實(shí)現(xiàn)通知發(fā)出后調(diào)用的方法

- (void)notificationAction:(NSNotification *)notifacation{

    NSLog(@"%@,%@",notifacation.object,[NSThread currentThread]);
    sleep(5);
    NSLog(@"通知發(fā)送了完畢");
}

4.接著運(yùn)行程序,點(diǎn)擊發(fā)送通知按鈕

屏幕快照 2016-11-24 下午10.35.49.png

5.我們來看下log輸出日志


屏幕快照 2016-11-24 下午10.37.39.png

看輸出的順序和時(shí)間就會(huì)發(fā)現(xiàn):在拋出通知以后,觀察者在通知事件處理完成以后(這里我們休眠5秒),拋出者才會(huì)往下繼續(xù)執(zhí)行,也就是說這個(gè)過程默認(rèn)是同步的;當(dāng)發(fā)送通知時(shí),通知中心會(huì)一直等待所有的observer都收到并且處理了通知才會(huì)返回到poster;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容