iOS 通知傳參使用方法

通知的使用方式:

1.注冊(cè)通知
2.發(fā)送通知
3.實(shí)現(xiàn)通知監(jiān)聽的方法
4.移除通知
我對(duì)于通知的理解和困惑:好處就是解耦,給代碼分層,任何兩個(gè)類之間都可以使用通知來傳遞參數(shù)和實(shí)現(xiàn)一些業(yè)務(wù)邏輯,和代理,KVO有異曲同工之妙。個(gè)人認(rèn)為通知會(huì)比代理寫代碼的時(shí)候簡(jiǎn)單很多,但是有的時(shí)候會(huì)不知道在什么時(shí)機(jī)去移除通知。如果在控制器之間,明確知道生命周期的時(shí)候,使用通知是比較高效的,因?yàn)橹篮螘r(shí)注冊(cè)通知,發(fā)送通知和移除通知。在單例對(duì)象中,最好不要注冊(cè)通知,因?yàn)閱卫谡麄€(gè)程序的運(yùn)行過程中都是不會(huì)銷毀的,導(dǎo)致注冊(cè)的通知的也無法移除,會(huì)出現(xiàn)未知BUG。比如你注冊(cè)了多個(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再次重新注冊(cè)鍵盤通知,才能防止用戶這種刁鉆操作影響了鍵盤的正常使用。

通知的類型:

有參和無參的區(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]];

//注冊(cè)通知:
[[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]];

//注冊(cè)通知:
[[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];

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容