Sending , Listening for and Reacting to Notifications (發送,監聽通知)

發送方:

//初始化通知內容  senderObject:self   userInfo:接收到通知時可從中獲取到的信息

+ (instancetype)notificationWithName:(NSString *)aName object:(id)senderObject userInfo:(NSDictionary *)userInfo

//發送通知

- (void)postNotification:(NSNotification *)notification


接收方(觀察者,監聽者):

//註冊通知

- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender

//取消通知

- (void)removeObserver:(id)notificationObserver


e.g.

======AppDelegate.h文件======

#import <UIKit/UIKit.h>


/*extern:聲明全局變量(不初始化),外部類可訪問到 */

//notificationName

extern NSString *const kSetPersonInfoNotification; 

//The first-name key in the user-info dictionary of our notification 

extern NSString *const kSetPersonInfoKeyFirstName; 

// The last-name key in the user-info dictionary of our notification 

extern NSString *const kSetPersonInfoKeyLastName;


@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow *window;

@end

=======AppDelegate.m文件=====

#import "AppDelegate.h"

#import "Person.h"


NSString *const kSetPersonInfoNotification = @"SetPersonInfoNotification";

NSString *const kSetPersonInfoKeyFirstName = @"firstName";

NSString *const kSetPersonInfoKeyLastName = @"lastName";


@implementation AppDelegate

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

    Person *steveJobs = [[Person alloc] init];   

    NSNotification *notification =

        [NSNotification  notificationWithName:kSetPersonInfoNotification

                                       object:self  //sender

                                     userInfo:@{kSetPersonInfoKeyFirstName : @"Steve",

                                                 kSetPersonInfoKeyLastName : @"Jobs"}];

    

    /* 在postNotification後,person class監聽到並從notification中的userInfo中獲取到了相關信息 */

   [[NSNotificationCenter defaultCenter] postNotification:notification];

    NSLog(@"Person's first name = %@", steveJobs.firstName);

    NSLog(@"Person's last name = %@", steveJobs.lastName);

    

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    self.window.backgroundColor = [UIColor whiteColor];

    [self.window makeKeyAndVisible];

    return YES;

}

========Person.h=========

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, copy) NSString *firstName;

@property (nonatomic, copy) NSString *lastName;

@end

========Person.m=========

#import "Person.h"

#import "AppDelegate.h"

@implementation Person

- (void) handleSetPersonInfoNotification:(NSNotification *)paramNotification{

    self.firstName =paramNotification.userInfo[kSetPersonInfoKeyFirstName];

    self.lastName = paramNotification.userInfo[kSetPersonInfoKeyLastName];   

}

//instancetype:返回類型  id:作爲參數

- (instancetype) init{

    self = [super init];

    if (self != nil){       

       NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

        //註冊通知  addObserver必須要對應一個removeObserver,否則可能會造成內存泄漏     

        [center addObserver:self  //觀察者,監聽者

                  selector:@selector(handleSetPersonInfoNotification:) //接收到通知時,執行的方法,必須要有一個NSNotification參數

                      name:kSetPersonInfoNotification   //通知名稱

                    object:[[UIApplication sharedApplication] delegate]];  //發送(通知)者        

    }

    return self;

}

- (void) dealloc{

    //取消註冊

   [[NSNotificationCenter defaultCenter] removeObserver:self];

}

@end



發佈了15 篇原創文章 · 獲贊 0 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章