开发当中用到通知,通知的定义必须要有一个字符串标识通知的名字。一般可以直接写一个字符串,在通知创建和监听的时候直接写这个字符串。
但这样做非常不好,随手创建写代码当时很舒服,但是后来维护的时候发现通知监听会散落到不同的文件,如果要改通知的名字,每个地方都要改,
将会非常麻烦。
如下面这样
//发出通知,在一个控制器
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];
这样通知名方便统一定义,修改通知名也不必要到处查找了,也避免了多处用字符串的错误,或者粘贴复制的麻烦。