oc之通知模式

通知

iOS中的通知一般分為廣播通知,本地通知和離線通知。我們這里說的就只是廣播通知。

關(guān)于廣播通知的理解我這里就不做過多的贅述,簡單來說就是一對多的發(fā)送消息(可以帶值)然后實現(xiàn)某種功能。好處就是解耦,給代碼分層,任何兩個類之間都可以使用通知來傳遞參數(shù)和實現(xiàn)一些業(yè)務(wù)邏輯,和代理,KVO有異曲同工之妙。但是在iOS9之前是需要移除通知的,如果在控制器之間,明確知道生命周期的時候,使用通知是比較高效的,因為知道何時注冊通知,發(fā)送通知和移除通知。在單例對象中,最好不要注冊通知,因為單例在整個程序的運行過程中都是不會銷毀的,導(dǎo)致注冊的通知的也無法移除,會出現(xiàn)未知BUG。比如你注冊了多個同樣Name的通知,而且多次發(fā)送通知,會造成崩潰。
但是在iOS9之后,還有在鍵盤的通知使用中,要在viewWillAppear 中add通知,在viewWillDisappear中remove 通知,因為viewWillAppear和viewWillDisappear這個方法會調(diào)用多次,當(dāng)觸發(fā)側(cè)滑返回時會調(diào)用系統(tǒng)自帶的viewWillDisappear:方法,要是這時候用戶取消了側(cè)滑返回(即回側(cè)滑到一半又松手了), 這個時候如果移除了鍵盤通知就收不到鍵盤通知了,所以要在viewWillAppear再次重新注冊鍵盤通知,才能防止用戶這種刁鉆操作影響了鍵盤的正常使用。
通知中心持有的是注冊者的weak指針,這時即使不對通知進(jìn)行手動移除,指針也會在注冊者被回收后自動置空。我們知道,向空指針發(fā)送消息是不會有問題的。
但是有一個例外。如果用

- (id <NSObject>)addObserverForName:(nullable NSNotificationName)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));

這個API來注冊通知,可以直接傳入block類型參數(shù)。使用這個API會導(dǎo)致注冊者被系統(tǒng)retain,因此仍然需要像以前一樣手動移除通知,同時這個block類型參數(shù)也需注意避免循環(huán)引用。

  • 下面舉個栗子

有參和無參的區(qū)別就是在 發(fā)送通知的時候是否給通知中心傳遞參數(shù),參數(shù)名是——userInfo——有參數(shù)就傳一個nsdictionry進(jìn)去,無參數(shù)就傳nil或者干脆不寫

  • 在需要發(fā)送通知的地方
//發(fā)送通知并且?guī)?shù)
/***
* postNotificationName:通知名字,作為通知的唯一標(biāo)識
* object:誰發(fā)送的通知
* userInfo:通知攜帶的參數(shù)
***/
    NSDictionary *dict = @{@"key":@"value"};
    [[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName" object:nil userInfo: dict];
  • 在需要接收通知的地方
//注冊通知:
/***
* addObserver:觀察者-消息接收方
* selector:處理通知的方法名
* name:通知的名字-一定要和你需要的通知名字一樣
***/
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomethingClick:) name:@"notificationName" object:nil];
//實現(xiàn)監(jiān)聽方法
-(void) doSomethingClick:(NSNotification *)notification
{
 NSString *Str = notification.userInfo[@"key"];
    if ([Str isEqualToString:@"value"]) {
// do something what you want to do.
    }
}
  • 移除通知-如果你用得上的話
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"notificationName" object:self];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,671評論 1 32
  • 1、通知的移除 (1)針對ViewController來說:不管是iOS9之前,還是iOS9之后,系統(tǒng)在調(diào)用dea...
    小秀秀耶閱讀 2,034評論 0 7
  • 1,NSObject中description屬性的意義,它可以重寫嗎?答案:每當(dāng) NSLog(@"")函數(shù)中出現(xiàn) ...
    eightzg閱讀 4,340評論 2 19
  • MVC 具有什么樣的優(yōu)勢,各個模塊之間怎么通信,比如點擊 Button 后 怎么通知 Model? [iOS] M...
    kidzss閱讀 4,375評論 1 37
  • 誰以后再跟我說,你家娃夠好了,別不知足。那你就把她領(lǐng)走,免費送你好幾天。娃睡了,我深呼吸三次,坐下來寫更。 一大早...
    碎碎妖閱讀 591評論 4 7

友情鏈接更多精彩內(nèi)容