1. 程式人生 > >iOS開發:NSNotificationCenter,通知中心的使用

iOS開發:NSNotificationCenter,通知中心的使用

        在開發過程中,使用通知的地方還是很多的,通知中心(NSNotificationCenter)實際上上一個訊息通知機制,是在程式內部提供的一種廣播機制。舉一個經典的應用場景:任意物件可以傳送通知到中心,同時任意物件也可以監聽中心傳送的通知。也就是說,把接收到的訊息,根據內部的訊息轉發表,把訊息轉發給需要的物件。

     一、 使用通知的步驟

       1.在需要接收通知的地方添加註冊觀察者;

       2.在需要的時候傳送通知訊息;

       3.接收通知,接到通知之後執行的方法;

       4.移除觀察者。

     二、例項

      在這裡我用通知來改變介面顏色的例項來說明,具體如下圖所示:

      控制器一的設定:


      控制器二的設定:

      

      Main.storyboard裡面的設定


        執行效果:





            部分程式碼:

 /*

     4個引數:

1)觀察者(向通知中心新增的通知接收者),self表示是當前的控制器

2)觀察者接收到通知後進行的響應事件操作(接收到通知後需要呼叫的方法)

3)通知的名字(舉個例子,相當於FM電臺中的頻道一樣)

4)接收發送者的通知,nil表示是接收所有傳送者的通知(預設狀態都設定為nil

     */

    //1.新增觀察者

    [[

NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeColor:) name:@"ChangeColor" object:nil];

/*

1)通知的名字

2)通知的傳送者

     3)附帶資訊

     */

    //當觀察者的object置為nil時,可以傳值;當觀察者接收固定物件的通知時(相當於觀察者object不置為nil時),可以用來指定通知的傳送者

    //2.傳送通知(傳送通知的時候也可以帶引數傳送)

    [[NSNotificationCenter defaultCenter]

postNotificationName:@"ChangeColor" object:[UIColor redColor]];

//3.傳送過來通知,接到通知之後執行的方法(接受通知)

- (void)changeColor:(NSNotification *)notifi {

    self.view.backgroundColor = notifi.object;

}

//4.移除觀察者 self

- (void)dealloc {

    [[NSNotificationCenter defaultCenter] removeObserver:self];

    //    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ChangeColor" object:nil];

}

     例子雖然簡單,但是隻要能理解這個通知中心的原理,就是一個成功的例子。。。

     三、其他注意事項

     1.通知中心的那個類,是使用的單例設計模式,每一個應用程式都會有一個預設的通知中心,可以用來排程通知的傳送的接受;

     2. 通知機制是實現應用程式中物件之間通訊的便捷工具,它可以讓物件可以知道其他地方發生的改變。一般情況下,一個物件新增為通知觀察者,是想讓它在相應的事件發生或者即將發生的時候進行改變狀態;

     3.通知不僅僅侷限於應用程式內部的通訊,還可通過分散式通知,一個程序可將發生的事件通知給其他另外一個程序;

     4.註冊通知時,要具體到通知的名稱和傳送的物件,對應用程式應該觀察的通知要有所選擇;

     5.儘可能快速高效地實現處理通知的方法,避免新增或者移除很多觀察者;

     6.如果傳送的通知指定了物件,那麼觀察者接收的通知設定的物件要與其一致,這樣才能接收到通知,但是接收通知如果將這個物件設定為nil,那麼就會接收一切通知;

     7.觀察者的SEL函式指標可以帶有一個引數,這個引數就是傳送的物件本身,可以通過這個引數獲取到訊息物件的引數,實現傳值。

     四、其他

     還有一種註冊通知的方法,在Viewwillappear方法裡面新增觀察者,然後在Viewwilldisappear方法裡面移除觀察者,即在頁面出現的時候註冊通知,頁面消失的時候移除通知。需要注意的是:僅僅在Viewwillappear方法裡面新增觀察者,沒有在Viewwilldisappear方法裡面移除觀察者,會造成當訊息發生時,方法會多次被呼叫。