NSNotificationCenter 注冊和移除的規范代碼


在我們開發中,我們經常可以看到這樣的代碼:

- (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];
  });
}                

 

總結

代碼一定要養成良好的習慣,該移除的還是要移除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM