zoukankan      html  css  js  c++  java
  • 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];

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

  • 相关阅读:
    继承
    iOS 适配暗黑模式
    【C++ STL】容器的选择
    纳税相关
    SwiftUI状态绑定:@State
    python 中各种容器可以容纳的数据类型
    open GL 在使用材质属性glMaterial设置物体颜色效果时,使用shader和使用固定管线后颜色区别
    做为一名测试工程师,你经常会用到或听到的那些工具
    推荐一款技术人必备的接口测试神器:Apifox
    测试管理工具推荐
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/9223380.html
Copyright © 2011-2022 走看看