iOS 通知中樞 NSNotificationCenter & NSNotification

來源:互聯網
上載者:User

通知中樞是 Foundation 架構的一個子系統,它嚮應用程式中註冊為某個事件觀察者的所有對象廣播訊息(即通知)。(從編程角度而言,它是 NSNotificationCenter 類的執行個體)。該事件可以是發生在應用程式中的任何事情,例如進入後台狀態,或者使用者開始在文本欄中鍵入。通知是告訴觀察者,事件已經發生或即將發生,因此讓觀察者有機會以合適的方式響應。通過通知中樞來傳播通知,是增加應用程式物件間合作和內聚力的一種途徑。


任何對象都可以觀察通知,但要做到這一點,該對象必須註冊,以接收通知。在註冊時,它必須指定選取器,以確定由通知傳送所調用的方法;方法簽名必須只有一個參數:通知對象。註冊後,觀察者也可以指定發布對象。

(以上是官方文檔中的解釋)

------------------------------------------華麗的分割線----------------------------------------------------------

通知中樞包括兩個重要的類:

(1)NSNotificationCenter:
實現NSNotificationCenter的原理是一個觀察者模式,獲得NSNotificationCenter的方法只有一種,那就是[NSNotificationCenter
defaultCenter] ,通過調用靜態方法defaultCenter就可以擷取這個通知中樞的對象了,而NSNotificationCenter是一個單例模式,而這個通知中樞的對象會一直存在於一個應用的生命週期。

  (2) 
NSNotification: 這是訊息攜帶的載體,通過它,可以把訊息內容傳遞給觀察者。

 (3)一個NSNotificationCenter可以有許多的通知訊息NSNotification,對於每一個NSNotification可以有很多的觀察者Observer來接收通知。

通過上面的介紹可以知道,通過通知中樞也可以實現不同類之間的參數傳遞。

注意當接受到訊息後,不想再收到訊息了,要把observer刪除remove。

下面介紹如何使用(具體解釋看文檔)。

(1)NSNotification
:用於建立傳遞的訊息

Creating Notifications+ notificationWithName:object:+ notificationWithName:object:userInfo:Getting Notification Information– name– object– userInfo

(2)NSNotificationCenter :用於發送訊息

Getting the Notification Center+ defaultCenterManaging Notification Observers– addObserverForName:object:queue:usingBlock:– addObserver:selector:name:object:– removeObserver:– removeObserver:name:object:Posting Notifications– postNotification:– postNotificationName:object:– postNotificationName:object:userInfo:

demo(例子中基本上涉及到以上所有的方法了):

定義了兩個類:Poster(發送訊息)和Observer(接受訊息)

Poster.h

#import <Foundation/Foundation.h>@interface Poster : NSObject-(void)postMessage;@end

Poster.m

#import "Poster.h"@implementation Poster-(void)postMessage{        //1.下面兩條語句等價    //二者的區別是第一條語句是之間發送訊息內容,第二條語句先建立一個訊息,然後再發送訊息    [[NSNotificationCenter defaultCenter] postNotificationName:@"PosterOne" object:@"This is posterone!"];    //    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"PosterOne" object:@"This is posterone"]];        //2.下面兩條語句等價    //參數:userInfo  --- Information about the the notification.    [[NSNotificationCenter defaultCenter] postNotificationName:@"PosterTwo" object:@"This is postertwo" userInfo:[NSDictionary dictionaryWithObject:@"value" forKey:@"key"]];    //    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"PosterTwo" object:@"This is postertwo" userInfo:[NSDictionary dictionaryWithObject:@"value" forKey:@"key"]]];}@end

Observer.h

#import <Foundation/Foundation.h>@interface Observer : NSObject-(void)observer;@end

Observer.m

#import "Observer.h"@implementation Observer-(void)observer {    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callBack1:) name:@"PosterOne" object:nil];        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callBack2:) name:@"PosterTwo" object:nil];        //刪除所有的observer//    [[NSNotificationCenter defaultCenter] removeObserver:self];    //刪除名字為name的observer//    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"PosterOne" object:nil];    }-(void)callBack1:(NSNotification*)notification{    NSString *nameString = [notification name];    NSString *objectString = [notification object];    NSLog(@"name = %@,object = %@",nameString,objectString);}-(void)callBack2:(NSNotification*)notification{    NSString *nameString = [notification name];    NSString *objectString = [notification object];    NSDictionary *dictionary = [notification userInfo];    NSLog(@"name = %@,object = %@,userInfo = %@",nameString,objectString,[dictionary objectForKey:@"key"]);}@end

main.m

#import <Foundation/Foundation.h>#import "Poster.h"#import "Observer.h"int main(int argc, const char * argv[]){    @autoreleasepool {                //注意這裡的順序,要先observer,然後再poster        Observer *myObserver = [[Observer alloc] init];        [myObserver observer];                Poster *poster = [[Poster alloc] init];        [poster postMessage];    }    return 0;}

好了,大概有關的內容都差不多了吧

附:

不過有個方法

addObserverForName:object:queue:usingBlock:

還不太懂如何使用,暫時放一下,有知道了麻煩評論告訴了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.