NSNotification 通知

通知 是在跳轉控制器之間常用的傳值代理方式纹冤,除了代理模式洒宝,通知更方便、便捷萌京,一個簡單的Demo實現(xiàn)通知的跳轉傳值.

一:創(chuàng)建通知(NSNotification)

-??初始化一個通知(NSNotification)對象

 @interface NSNotification (NSNotificationCreation)
 + (instancetype)notificationWithName:(NSNotificationName)aName object:(nullable id)anObject;
 + (instancetype)notificationWithName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
 - (instancetype)init /*NS_UNAVAILABLE*/;    /* do not invoke; not a valid initializer for this class */
 @end

 /* 創(chuàng)建通知的理解
  NSNotification作為一種消息傳遞的媒介, 
  包含三個public成員變量雁歌,
  通過NSNotificationName類型的name來查找對應observer,
  并且可以在object和userInfo中傳入?yún)?shù)知残。
  可以使用上述的幾種初始化方式進行初始化靠瞎。
 */

-??一個完整的通知一般包含3個屬性:

- (NSString*)name;//通知的名稱

- (id)object;//通知發(fā)布者(是誰要發(fā)布通知)

- (NSDictionary*)userInfo;//一些額外的信息(通知發(fā)布者傳遞給通知接收者的信息內容)

二: 在通知中心添加觀察者

??通知中心(NSNotificationCenter)提供了方法來注冊一個監(jiān)聽通知的監(jiān)聽器(Observer)

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;

  //observer:監(jiān)聽器,即誰要接收這個通知
  //aSelector:收到通知后橡庞,回調監(jiān)聽器的這個方法较坛,并且把通知對象當做參數(shù)傳入
  //aName:通知的名稱。如果為nil扒最,那么無論通知的名稱是什么丑勤,監(jiān)聽器都能收到這個通知
  //anObject:通知發(fā)布者。如果為anObject和aName都為nil吧趣,監(jiān)聽器都收到所有的通知

三: 發(fā)布通知

??通知中心(NSNotificationCenter)提供了相應的方法來幫助發(fā)布通知

- (void)postNotification:(NSNotification *)notification;
 //發(fā)布一個notification通知法竞,可在notification對象中設置通知的名稱、通知發(fā)布者强挫、額外信息等

- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;
 //發(fā)布一個名稱為aName的通知岔霸,anObject為這個通知的發(fā)布者

- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
 //發(fā)布一個名稱為aName的通知,anObject為這個通知的發(fā)布者俯渤,aUserInfo為額外信息

.

四 移除觀察者

- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(nullable NSNotificationName)aName object:(nullable id)anObject;
// iOS4以后呆细,以block的形式代替selector方式為通知中心添加觀察者
- (id <NSObject>)addObserverForName:(nullable NSNotificationName)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);

五 通知中心:(NSNotificationCenter)

  • 每一個應用程序都有一個通知中心(NSNotificationCenter)實例,專門負責協(xié)助不同對象之間的消息通信
  • 任何一個對象都可以向通知中心發(fā)布通知(NSNotification)八匠,描述自己在做什么絮爷。其他感興趣的對象(Observer)可以申請在某個特定通知發(fā)布時(或在某個特定的對象發(fā)布通知時)收到這個通知

??舉例

?舉個例子??:在發(fā)送通知后,在所要接收的控制器中注冊通知監(jiān)聽者梨树,將通知發(fā)送的信息接收

 //發(fā)送通知方法
 - (void)postNotification{

    //添加字典
    NSDictionary *dict =[[NSDictionary alloc]initWithObjectsAndKeys:self.textFieldOne.text,@"textOne",self.textFieldTwo.text,@"textTwo",nil];

    //創(chuàng)建通知  用來傳送字典數(shù)據(jù)
    NSNotification *notification=[NSNotification notificationWithName:@"tongzhi"object:niluserInfo:dict];

    //發(fā)送通知
    [[NSNotificationCenter  defaultCenter] postNotification:notification];

}


 - (void)viewDidLoad{
     [superviewDidLoad];

     //添加通知觀察者  監(jiān)聽通知
     [[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(tongzhi:)name:@"tongzhi"object:nil];
}

  //接收到通知
 - (void)tongzhi:(NSNotification*)notification{

      NSLog(@"%@", notification.userInfo);
      NSLog(@"-----接收到通知------");

      //notification.object通知的發(fā)布者
      //notification.userInfo發(fā)送者給接受者發(fā)送的信息
      //notification.name通知的名稱
}

  - (void)dealloc {

       //移除通知
       [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil];
      
  }

移除通知:removeObserver:和removeObserver:name:object:
其中坑夯,removeObserver:是刪除通知中心保存的調度表一個觀察者的所有入口,而removeObserver:name:object:是刪除匹配了通知中心保存的調度表中觀察者的一個入口抡四。
這個比較簡單柜蜈,直接調用該方法就行。例如:
[[NSNotificationCenter defaultCenter] removeObserver:observername:nil object:self];
注意參數(shù)notificationObserver為要刪除的觀察者指巡,一定不能置為nil淑履。

????補充: 通知和代理的區(qū)別1、相同點

代理和通知都能完成對象之間的通信(A對象告訴B對象發(fā)生了什么,A對象傳遞數(shù)
據(jù)給B對象)2藻雪、不同點
代理:1對1(1個對象,只能告訴另一個對象發(fā)生了什么)
通知:多對多(1個對象可以通知多個對象,1個對象可以訂閱多個對象發(fā)布的通
知)

參考網址1:http://www.reibang.com/p/356f7af4f2ee
參考網址2:http://blog.sina.com.cn/s/blog_6317728d0102v779.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末秘噪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阔涉,更是在濱河造成了極大的恐慌缆娃,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑰排,死亡現(xiàn)場離奇詭異贯要,居然都是意外死亡,警方通過查閱死者的電腦和手機椭住,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門崇渗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人京郑,你說我怎么就攤上這事宅广。” “怎么了些举?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵跟狱,是天一觀的道長。 經常有香客問我户魏,道長驶臊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任叼丑,我火速辦了婚禮关翎,結果婚禮上,老公的妹妹穿的比我還像新娘鸠信。我一直安慰自己纵寝,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布星立。 她就那樣靜靜地躺著爽茴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贞铣。 梳的紋絲不亂的頭發(fā)上闹啦,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音辕坝,去河邊找鬼窍奋。 笑死,一個胖子當著我的面吹牛酱畅,可吹牛的內容都是我干的琳袄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼纺酸,長吁一口氣:“原來是場噩夢啊……” “哼窖逗!你這毒婦竟也來了?” 一聲冷哼從身側響起餐蔬,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤碎紊,失蹤者是張志新(化名)和其女友劉穎佑附,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仗考,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡音同,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秃嗜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片权均。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锅锨,靈堂內的尸體忽然破棺而出叽赊,到底是詐尸還是另有隱情,我是刑警寧澤必搞,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布必指,位于F島的核電站,受9級特大地震影響恕洲,放射性物質發(fā)生泄漏取劫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一研侣、第九天 我趴在偏房一處隱蔽的房頂上張望谱邪。 院中可真熱鬧,春花似錦庶诡、人聲如沸惦银。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扯俱。三九已至,卻和暖如春喇澡,著一層夾襖步出監(jiān)牢的瞬間迅栅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工晴玖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留读存,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓呕屎,卻偏偏與公主長得像让簿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秀睛,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容

  • iOS 提供了一種 “同步的” 消息通知機制NSNotificationCenter尔当,觀察者只要向消息中心注冊, ...
    MasterChen閱讀 2,195評論 4 16
  • 概述 在多數(shù)移動應用中任何時候都只能有一個應用程序處于活躍狀態(tài)蹂安,如果其他應用此刻發(fā)生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,497評論 1 8
  • 關于其他使用,點擊>>>>iOS NSNotificationCenter 使用姿勢詳解 通知 是在跳轉控制器之間...
    Amok校長閱讀 1,303評論 0 3
  • 如果在一個類中想要執(zhí)行另一個類中的方法可以使用通知1.創(chuàng)建一個通知對象:使用notificationWithNam...
    wangjianjun0730閱讀 739評論 0 0
  • 以下筆記參考自《你不知道的JavaScript上卷》 一.原型 1.[[Prototype]]是什么椭迎? 它是Jav...
    姚屹晨閱讀 582評論 0 2