• iOS 通知名的通用定义方法


      开发当中用到通知,通知的定义必须要有一个字符串标识通知的名字。一般可以直接写一个字符串,在通知创建和监听的时候直接写这个字符串。

    但这样做非常不好,随手创建写代码当时很舒服,但是后来维护的时候发现通知监听会散落到不同的文件,如果要改通知的名字,每个地方都要改,

    将会非常麻烦。

    如下面这样

    //发出通知,在一个控制器
    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];

    这样通知名方便统一定义,修改通知名也不必要到处查找了,也避免了多处用字符串的错误,或者粘贴复制的麻烦。

  • 相关阅读:
    python note 19 异常处理
    python note 18 序列化模块
    python note 17 random、time、sys、os模块
    python note 16 re模块的使用
    python note 15 正则表达式
    python note 13 内置函数
    python note 12 生成器、推导式
    C++ int型负数除法取余问题
    Leetcode162. 寻找峰值
    Leetcode450. 删除二叉搜索树中的节点
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/9223380.html
Copyright © 2020-2023  润新知