NSNotification 通知

通知 是在跳轉控制器之間常用的傳值代理方式,除了代理模式,通知更方便、便捷,一個簡單的Demo實現通知的跳轉傳值.

一:創建通知(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

 /* 創建通知的理解
  NSNotification作為一種消息傳遞的媒介, 
  包含三個public成員變量,
  通過NSNotificationName類型的name來查找對應observer,
  并且可以在object和userInfo中傳入參數。
  可以使用上述的幾種初始化方式進行初始化。
 */

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

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

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

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

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

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

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

  //observer:監聽器,即誰要接收這個通知
  //aSelector:收到通知后,回調監聽器的這個方法,并且把通知對象當做參數傳入
  //aName:通知的名稱。如果為nil,那么無論通知的名稱是什么,監聽器都能收到這個通知
  //anObject:通知發布者。如果為anObject和aName都為nil,監聽器都收到所有的通知

三: 發布通知

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

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

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

- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
 //發布一個名稱為aName的通知,anObject為這個通知的發布者,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)實例,專門負責協助不同對象之間的消息通信
  • 任何一個對象都可以向通知中心發布通知(NSNotification),描述自己在做什么。其他感興趣的對象(Observer)可以申請在某個特定通知發布時(或在某個特定的對象發布通知時)收到這個通知

??舉例

?舉個例子??:在發送通知后,在所要接收的控制器中注冊通知監聽者,將通知發送的信息接收

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

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

    //創建通知  用來傳送字典數據
    NSNotification *notification=[NSNotification notificationWithName:@"tongzhi"object:niluserInfo:dict];

    //發送通知
    [[NSNotificationCenter  defaultCenter] postNotification:notification];

}


 - (void)viewDidLoad{
     [superviewDidLoad];

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

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

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

      //notification.object通知的發布者
      //notification.userInfo發送者給接受者發送的信息
      //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];
注意參數notificationObserver為要刪除的觀察者,一定不能置為nil。

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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