iOS學習——(轉)iOS中關於通知的使用,ios通知
在移動端開打過程中,經常會用到通知和推送,例如有簡訊來了需要通知提示,手機橫屏了需要通知提示,插上耳機了需要通知提示等等,我們可以根據這些通知採取對應的動作。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]; }