日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS NSNotificationCenter详解

發(fā)布時間:2024/8/26 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS NSNotificationCenter详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

通知中心的特點:

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。