在我們開發中,我們經常可以看到這樣的代碼:
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:@"test" object:nil]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self name:@"test" object:nil]; }
就是在頁面出現的時候注冊通知,頁面消失時移除通知。你這邊可要注意了,一定要成雙成對出現,通過指定的 name 移除通知,如果你只在viewWillAppear 中 addObserver沒有在viewWillDisappear 中 removeObserver那么當消息發生的時候,你的方法會被調用多次。
正確的多線程通知發送和接收
NSNotificationCenter消息的接受線程是基於發送消息的線程的。也就是同步的,因此,有時候,你發送的消息可能不在主線程,而大家都知道操作UI必須在主線程,不然會出現不響應的情況。所以,在你收到消息通知的時候,注意選擇你要執行的線程。下面看個示例代碼
//接受消息通知的回調 - (void)test { if ([[NSThread currentThread] isMainThread]) { NSLog(@"main"); } else { NSLog(@"not main"); } dispatch_async(dispatch_get_main_queue(), ^{ //do your UI }); } //發送消息的線程 - (void)sendNotification { dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(defaultQueue, ^{ [[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:nil]; }); }
總結
代碼一定要養成良好的習慣,該移除的還是要移除。
