- 相信小伙伴們平時沒怎么注意過通知是同步還是異步,直到在面試的時候被面試官問的一臉懵逼,才開始思考,yes or not ?
- 下面我們一起來揭開這個神秘的面紗:通知到底是同步還是異步?
1.在ViewController.m中創建發送通知的btn,并注冊通知
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.backgroundColor = [UIColor greenColor];
[btn setTitle:@"發送通知" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
btn.frame = CGRectMake(100, 100, 80, 30);
[self.view addSubview:btn];
// 注冊通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction:) name:@"kNotification" object:nil];
}
2.在btn的按鈕點擊調用方法中發送通知:
-(void)btnAction{
//發送通知,通知內容為:通知發送了
[[NSNotificationCenter defaultCenter] postNotificationName:@"kNotification" object:@"通知發送了"];
[NSThread currentThread];
NSLog(@"按鈕點擊了");
}
3.實現通知發出后調用的方法
- (void)notificationAction:(NSNotification *)notifacation{
NSLog(@"%@,%@",notifacation.object,[NSThread currentThread]);
sleep(5);
NSLog(@"通知發送了完畢");
}
4.接著運行程序,點擊發送通知按鈕
屏幕快照 2016-11-24 下午10.35.49.png
5.我們來看下log輸出日志
屏幕快照 2016-11-24 下午10.37.39.png
看輸出的順序和時間就會發現:在拋出通知以后,觀察者在通知事件處理完成以后(這里我們休眠5秒),拋出者才會往下繼續執行,也就是說這個過程默認是同步的;當發送通知時,通知中心會一直等待所有的observer都收到并且處理了通知才會返回到poster;