在移動端開打過程中,經常會用到通知和推送,例如有簡訊來了需要通知提示,手機橫屏了需要通知提示,插上耳機了需要通知提示等等,我們可以根據這些通知採取對應的動作。iOS系統自身定義了很對通知,但是在開發過程中我們也可以進行自定義一些通知,然後利用NSNotificationCenter在需要的時候進行發 ...
在移動端開打過程中,經常會用到通知和推送,例如有簡訊來了需要通知提示,手機橫屏了需要通知提示,插上耳機了需要通知提示等等,我們可以根據這些通知採取對應的動作。iOS系統自身定義了很對通知,但是在開發過程中我們也可以進行自定義一些通知,然後利用NSNotificationCenter在需要的時候進行發送通知,在接收到通知時採取對應的動作。
通知的學習其實很簡單,首先我們需要註冊通知,這樣才能接收到對應類型的通知,並定義接收到通知時所採取的動作;其次就是我們需要學會在何時發送通知,當然,對於iOS系統定義的通知的發送是自發的,不需要我們進行發送,當然我們也可以用這種方法進行模擬發送系統定義的通知;最後我們需要瞭解的就是如何移除通知。
在開始之前,我們首先瞭解一下系統定義了那些通知,官網的定義如下:NSNotificationName。大家有需要可以自行查看,由於太多,所以建議大家在需要用到通知類的時候直接找度娘問有沒有對應的通知類名,有則去官網找對應的解釋和說明,沒有則進行自定義。
下麵的內容主要來源於文章:iOS創建添加通知、發送通知、移除通知。
1 創建通知
關於創建通知,最好是在viewDidLoad的方法中創建
- (void)viewDidLoad { [super viewDidLoad]; //創建通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tongzhi:) name:@"tongzhi" object:nil]; } //接收通知並相應的方法 - (void) tongzhi:(NSNotification *)notification{ NSDictionary *dic = notification.object; // NSLog(@"通知過來的 - dic = %@",notification.object); }
2 發送通知
//配置發送的通知攜帶的參數 NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"324234",@"bankId",@"某某銀行",@"bankName", nil]; //通過通知中心發送通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"tongzhi" object:dic];
3 移除通知
根據誰創建,誰負責的原則,一般是創建通知的那個控制器來移除通知,最好在dealloc方法中移除,如果通知不能及時的移除掉,當下次進入該控制器時會重覆創建NSNotificationCenter,在對應方法中發送通知給上一次創建的通知,但是上一個通知所在的控制器已被幹掉,所以這時候就會報錯。
-(void)dealloc{ //第一種方法.這裡可以移除該控制器下的所有通知 // 移除當前所有通知 NSLog(@"移除了所有的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self]; //第二種方法.這裡可以移除該控制器下名稱為tongzhi的通知 //移除名稱為tongzhi的那個通知 NSLog(@"移除了名稱為tongzhi的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil]; }
註意:如果dealloc方法不調用,說明當前有變數沒有被釋放,這時如果找不到問題所在,也可以重寫控制器的返回按鈕backBarButtonItem事件,在返回的時候進行移除通知操作。此外,如果dealloc不調用,說明存在記憶體泄漏,這個問題是必須要解決的,在iOS開發過程中,對記憶體泄漏的管理是非常嚴格的,我們務必做好這方面的工作,具體關於記憶體泄漏問題的註意事項和查找方法可以參見我之前的一篇隨筆:iOS學習——記憶體泄漏檢查及原因分析
//返回上一層界面事件 -(void)backPreviousViewControllerAction{ //第一種方法.這裡可以移除該控制器下的所有通知 // 移除當前所有通知 NSLog(@"移除了所有的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self]; //第二種方法.這裡可以移除該控制器下名稱為tongzhi的通知 //移除名稱為tongzhi的那個通知 NSLog(@"移除了名稱為tongzhi的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil]; // 返回上一層界面 [self.navigationController popViewControllerAnimated:YES]; }