通知的使用方式:
1.注冊通知
2.發(fā)送通知
3.實(shí)現(xiàn)通知監(jiān)聽的方法
4.移除通知
我對于通知的理解和困惑:好處就是解耦道逗,給代碼分層,任何兩個(gè)類之間都可以使用通知來傳遞參數(shù)和實(shí)現(xiàn)一些業(yè)務(wù)邏輯献烦,和代理滓窍,KVO有異曲同工之妙。個(gè)人認(rèn)為通知會(huì)比代理寫代碼的時(shí)候簡單很多巩那,但是有的時(shí)候會(huì)不知道在什么時(shí)機(jī)去移除通知吏夯。如果在控制器之間,明確知道生命周期的時(shí)候即横,使用通知是比較高效的噪生,因?yàn)橹篮螘r(shí)注冊通知,發(fā)送通知和移除通知令境。在單例對象中杠园,最好不要注冊通知,因?yàn)閱卫谡麄€(gè)程序的運(yùn)行過程中都是不會(huì)銷毀的舔庶,導(dǎo)致注冊的通知的也無法移除抛蚁,會(huì)出現(xiàn)未知BUG。比如你注冊了多個(gè)同樣Name的通知惕橙,而且多次發(fā)送通知瞧甩,會(huì)造成崩潰。
還有在鍵盤的通知使用中弥鹦,要在viewWillAppear
中add通知肚逸,在viewWillDisappear
中remove 通知,因?yàn)?code>viewWillAppear和viewWillDisappear
這個(gè)方法會(huì)調(diào)用多次,當(dāng)觸發(fā)側(cè)滑返回時(shí)會(huì)調(diào)用系統(tǒng)自帶的viewWillDisappear:方法彬坏,要是這時(shí)候用戶取消了側(cè)滑返回(即回側(cè)滑到一半又松手了), 這個(gè)時(shí)候如果移除了鍵盤通知就收不到鍵盤通知了朦促,所以要在viewWillAppear
再次重新注冊鍵盤通知,才能防止用戶這種刁鉆操作影響了鍵盤的正常使用栓始。
通知的類型:
有參和無參的區(qū)別就是在 發(fā)送通知的時(shí)候是否給通知中心傳遞參數(shù)务冕,參數(shù)名是——userInfo
1.無參
[[NSNotificationCenter defaultCenter] postNotificationName:@"Notification_name" object:userProfile userInfo:沒有參數(shù),這里就是空];
沒有參數(shù)的使用方法:
//發(fā)送通知
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"loadH5code" object:nil userInfo:nil]];
//注冊通知:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loadH5code) name:@"loadH5code" object:nil];
//實(shí)現(xiàn)監(jiān)聽方法
-(void)loadH5code{
// do something
}
2.有參
[[NSNotificationCenter defaultCenter] postNotificationName:@"Notification_name" object:userProfile userInfo:有參數(shù),參數(shù)類型是NSDictionary];
所以命名參數(shù)的格式為
NSDictionary *dict = @{@"key":@"value"};
這是整個(gè)有參數(shù)的通知使用方法:
//發(fā)送通知
NSDictionary *dict = @{@"key":@"value"};
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"loadH5code" object:nil userInfo:dict]];
//注冊通知:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loadH5code:) name:@"loadH5code" object:nil];
//實(shí)現(xiàn)監(jiān)聽方法
-(void)loadH5code:(NSNotification *)notification
{
NSString *loadPathStr = notification.userInfo[@"key"];
if ([h5PathStr isEqualToString:@"value"]) {
// do something
}
}
最后就是移除通知了(切記要移除幻赚,不然有意想不到的欲罷不能欲仙欲死的bug)
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"loadH5code" object:self];