開發當中用到通知,通知的定義必須要有一個字符串標識通知的名字。一般可以直接寫一個字符串,在通知創建和監聽的時候直接寫這個字符串。
但這樣做非常不好,隨手創建寫代碼當時很舒服,但是后來維護的時候發現通知監聽會散落到不同的文件,如果要改通知的名字,每個地方都要改,
將會非常麻煩。
如下面這樣
//發出通知,在一個控制器 NSNotification *noti = [NSNotification notificationWithName:@"kNotificationName" object:nil userInfo:nil]; [[NSNotificationCenter defaultCenter] postNotification:noti]; //監聽接收通知, 可能在多個不同的控制器 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getCarStatusTimerStopAction:) name:@"kNotificationName" object:nil];
推薦做法:蘋果預定義的通知做法,只需要把通知名字提取出來,放到一個文件夾里。然后在預編譯 .pch文件引入即可。
蘋果是這樣定義的:
UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification;
UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification;
UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification;
UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification;
UIKIT_EXTERN 是一個內置宏,它在UIKitDefines.h里。
1 #ifdef __cplusplus 2 #define UIKIT_EXTERN extern "C" __attribute__((visibility ("default"))) 3 #else 4 #define UIKIT_EXTERN extern __attribute__((visibility ("default"))) 5 #endif
我們可以參照蘋果的做法,自己定義一個 通知常量文件,把所有的通知名稱的定義放到該文件中。然后在通知的定義和監聽的地方直接使用就可以了。
當然,如果你的項目大,模塊多,可以定義多個這樣的文件。
APPNameNotification.h
UIKIT_EXTERN NSString *const kNotificationName;
APPNameNotification.m
NSString *const kNotificationName = @"kNotificationName";
這里需要注意,一下定義的通知名稱是一個指針常量,保證通知名在其他地方不被修改。NSString *指向的值是不可修改的,但是 指針可以改變指向,所以這里一定要在*號后面加const.
用的時候,把APPNameNotification.h 引入 .pch 文件
//發出通知,在一個控制器 NSNotification *noti = [NSNotification notificationWithName:kNotificationName object:nil userInfo:nil]; [[NSNotificationCenter defaultCenter] postNotification:noti]; //監聽接收通知, 可能在多個不同的控制器 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getCarStatusTimerStopAction:) name:kNotificationName object:nil];
這樣通知名方便統一定義,修改通知名也不必要到處查找了,也避免了多處用字符串的錯誤,或者粘貼復制的麻煩。
