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