iOS NSNotificationCenter详解
通知中心的特點:
1:同步執(zhí)行
2: 一對多發(fā)送消息
3: 降低程序耦合度
通知中心是單例,目的就是從任意一個發(fā)送消息到任意一個接收者,是同步執(zhí)行的。
那么什么是同步呢?
用網(wǎng)上經(jīng)典的說法,就是我叫朋友去吃飯,如果他沒來,我就繼續(xù)叫,等到他出來了我們才一起去吃,這就是同步;如果我叫朋友去吃飯,叫完無論他有沒有來,我都先去吃飯,
這就是異步;在通知中心里就是每發(fā)送一次消息,要等消息被接收并完全執(zhí)行完里面的方法,然后才返回來發(fā)送第二條消息,這就是同步,即通知中心發(fā)送消息是一條一條發(fā)送,而且是上條消息執(zhí)行完才執(zhí)行下一條的。
?
NSNotificationCenter的使用:
步驟主要有三個:注冊通知、發(fā)送廣播、銷毀廣播 ? 另外還有創(chuàng)建通知
默認都是用defaultCenter,而通知不需要時可省略
先介紹一下聲明方法:
?
創(chuàng)建一個通知的方法:
第一種方法三個參數(shù):name:通知名稱 ? object:標識(nullable id類型) ?userInfo:字典類型,傳值用
object這個參數(shù)要注意一下,其實這個參數(shù)不是用來傳值的,如果要傳值,就用userInfo,而object的作用是用來指定收發(fā)對象的,即接收端過濾廣播用的,不使用時用nil
NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"cen",@"ter", nil];[NSNotification notificationWithName:@"center" object:@"center2" userInfo:dic];第二種兩個參數(shù),object不是傳值用,同上
[NSNotification notificationWithName:@"center" object:nil];//不帶標識 //對比: [NSNotification notificationWithName:@"center" object:@"center1"];//帶標識?
添加觀察者,注冊通知
第一種方法 參數(shù)1:發(fā)生通知的對象;參數(shù)2:方法;參數(shù)3:通知的名稱;參數(shù)4:標示(同前)
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(otion:) name:@"center" object:nil];第二種方法 參數(shù)1:通知名稱,參數(shù)2:標識,參數(shù)3:隊列,參數(shù)4:block[跟方法1的區(qū)別是使用了block和隊列]
[[NSNotificationCenter defaultCenter]addObserverForName:@"ocenter" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {}];?
發(fā)送廣播
第一種 參數(shù)類型是notification ?直接把通知對象發(fā)送出去
[[NSNotificationCenter defaultCenter]postNotification:self.notification];第二種 參數(shù)跟以前的一樣
[[NSNotificationCenter defaultCenter]postNotificationName:@"center" object:nil userInfo:dic];第三種
[[NSNotificationCenter defaultCenter]postNotificationName:@"center" object:nil];?
銷毀廣播
第一種 通過廣播名字來銷毀廣播
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"center" object:nil];第二種 通過廣播對象銷毀廣播 ?這里注意如果不使用詳細的對象來銷毀的話,那盡量避免使用這個方法來銷毀廣播,假如self是控制器,那可能連系統(tǒng)自己注冊的
其它通知也被一起銷毀了,除非連同系統(tǒng)那部分也都不要了,就可用self
[[NSNotificationCenter defaultCenter]removeObserver:self.notification];?
舉個例子:
第一步:創(chuàng)建通知
聲明方式
@property(nonatomic,strong)NSNotification *notification;
NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"cen",@"ter", nil];self.cnotification = [NSNotification notificationWithName:@"center" object:@"user" userInfo:dic];?
第二步:注冊通知
接收方的控制器里 監(jiān)聽name為center的通知,可在多個控制器里注冊通知,而通知中心不用知道接收方是什么,接收方也可接收,這就可以降低程序的耦合度
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(tion:) name:@"center" object:nil];這里就用到object的過濾效果,假如上面創(chuàng)建了多個通知名字都為center,那么在接收的時候就可以用object過濾
-(void)tion:(NSNotification *)notification{if ([notification.object isEqualToString:@"user"]) {NSLog(@"this's notification is center");} }?
第三步:發(fā)送廣播
做個循環(huán)發(fā)送的廣播
這里用從創(chuàng)建通知的地方用定時器發(fā)送通知
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(post) userInfo:nil repeats:YES]; -(void)post {[[NSNotificationCenter defaultCenter]postNotification:self.notification]; }如果創(chuàng)建多個post發(fā)送廣播的話,可添加對應的方法來驗證通知中心的一對多和通知中心的同步性,通知中心每發(fā)送一個廣播之后會等待注冊通知里的方法(如例子里的tion方法)執(zhí)行完才會發(fā)送下一條廣播,無論該方法的執(zhí)行時間有多長,在沒有引入多線程的時候,按發(fā)送的廣播先后順序執(zhí)行,先發(fā)送的先執(zhí)行,跟注冊通知的創(chuàng)建先后順序沒有關(guān)
系,當然接收端必須已經(jīng)實例化才能接收;如果引入了多線程發(fā)送消息,那就得看線程里誰先被發(fā)送了,當然也是先發(fā)送的先執(zhí)行,
?
第四步:最后是銷毀,例如
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"center" object:nil];?簡化使用時,可用2、3、4步即可,例子就需要修改,可以根據(jù)需要從注冊里添加object,和發(fā)送的通知里帶信息
?
這里還涉及到觀察者的注冊和銷毀問題
觀察者的創(chuàng)建和銷毀要成對存在,一次添加對應一次銷毀
創(chuàng)建的位置如? viewWillAppear ?和 ?viewDidAppear, 銷毀的位置如 ??viewWillDisappear 、viewDidDisappear ?和 dealloc
就是在頁面出現(xiàn)的時候注冊通知,頁面消失時移除通知。一定要成雙成對出現(xiàn),如果你只在viewWillAppear 中 addObserver沒有在viewWillDisappear 中 removeObserver那么當消息發(fā)生的時候,你的方法會被調(diào)用多次。
?
當然詳細的還是根據(jù)需要的來進行修改,如有些通知是在整個工程里用到,創(chuàng)建在appDelegate里,如果通知中心在其他地方有需要用到而不用馬上銷毀時,使用完成時再進行
銷毀,從實際情況確定。
NSNotificationCenter就到這了,如果有地方說得不對的話,歡迎大家指出
轉(zhuǎn)載于:https://www.cnblogs.com/fcug/p/5312224.html
總結(jié)
以上是生活随笔為你收集整理的iOS NSNotificationCenter详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [老老实实学WCF] 第八篇 实例化
- 下一篇: “未能加载文件或程序集“EntityFr