IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> iOS开发如何限制NSNotification的作用范围 -> 正文阅读

[移动开发]iOS开发如何限制NSNotification的作用范围

??在实际的开发中NSNotification能够很好地解耦代码,跨层传输数据等。但是由于是全局生效的。因此有时候我们不想作用范围那么广,只想局限在某个范围内进行通知的发送与接收。最近弄了一个方案,分享给大家。我这边主要分为两部分进行处理

在某个类的范围内生效

?? 在实际的开发过程中,有时候通知的范围只在与某个类的范围内生效,也即只要是这个类创建的对象内都会生效,在app运行期间可能同时存在一个类的多个对象。针对这种情况,我这边将通知的发送,接收和类名进行了关联。这样能够保证通知只在该类相关的范围内生效。具体代码如下:
OC:

/// 在一定范围内发送通知
/// @param moduleName 模块名
/// @param notificationName 通知的名字
- (void)jk_postNotificationAtModule:(NSString *)moduleName
                   notificationName:(NSString *)notificationName;

/// 在一定范围内发送通知
/// @param moduleName 模块名
/// @param notificationName 通知的名字
/// @param object object
/// @param userInfo userInfo
- (void)jk_postNotificationAtModule:(NSString *)moduleName
                   notificationName:(NSString *)notificationName
                             object:(nullable id)object
                           userInfo:(nullable NSDictionary *)userInfo;
/// 在一定范围内监听通知事件
/// @param moduleName 模块名
/// @param name 通知名字
/// @param block 通知事件处理
- (void)jk_observeNotificationAtModule:(NSString *)moduleName
                               forName:(NSString *)name
                            usingBlock:(void(^)(NSNotification *notification))block;

/// 在一定范围内监听一组通知事件
/// @param moduleName 模块名
/// @param names 通知名称数组
/// @param block 通知事件处理
- (void)jk_observeNotificationAtModule:(NSString *)moduleName
                              forNames:(NSArray<NSString *> *)names
                            usingBlock:(void(^)(NSNotification *notification))block;

备注:其中moduleName是和某个类存在一一对应关系的字符串,也可以是自定义的一个模块名,发送通知和接收通知的时候要保持一致

swift:

    /// 在一定范围内发送通知
    /// - Parameters:
    ///   - moduleName: 模块名
    ///   - notificationName: 通知名字
    func jk_postNotification(at moduleName:String, notificationName:String) -> Void
    
    /// 在一定范围内发送通知
    /// - Parameters:
    ///   - moduleName: 模块名
    ///   - notificationName: 通知名字
    ///   - object: object
    ///   - userInfo: userInfo
    func jk_postNotification(at moduleName:String, notificationName:String, object:Any?, userInfo:[AnyHashable : Any]?) -> Void
    
/// 在一定范围内监听通知事件
/// @param moduleName 模块名
/// @param name 通知名字
/// @param block 通知事件处理
- (void)jk_observeNotificationAtModule:(NSString *)moduleName
                               forName:(NSString *)name
                            usingBlock:(void(^)(NSNotification *notification))block;

/// 在一定范围内监听一组通知事件
/// @param moduleName 模块名
/// @param names 通知名称数组
/// @param block 通知事件处理
- (void)jk_observeNotificationAtModule:(NSString *)moduleName
                              forNames:(NSArray<NSString *> *)names
                            usingBlock:(void(^)(NSNotification *notification))block;

备注:其中moduleName是和某个类存在一一对应关系的字符串,也可以是自定义的一个模块名,发送通知和接收通知的时候要保持一致

在某个对象的范围内生效

??在实际的开发过程中,有时候只想通知的作用范围只在某个类的实例对象范围内有效,即使是同一个类的其他实例对象也不生效。具体代码如下:
OC:

/// 在一定范围内发送通知
/// @param moduleInstance 模块实例对象
/// @param notificationName 通知的名字
- (void)jk_postNotificationAtModuleInstance:(__kindof NSObject *)moduleInstance
                           notificationName:(NSString *)notificationName;

/// 在一定范围内发送通知
/// @param moduleInstance 模块实例对象
/// @param notificationName 通知的名字
/// @param object object
/// @param userInfo userInfo
- (void)jk_postNotificationAtModuleInstance:(__kindof NSObject *)moduleInstance
                           notificationName:(NSString *)notificationName
                                     object:(nullable id)object
                                   userInfo:(nullable NSDictionary *)userInfo;
                                   
/// 在一定范围内监听通知事件
/// @param moduleInstance 模块实例对象
/// @param name 通知名字
/// @param block 通知事件处理
- (void)jk_observeNotificationAtModuleInstance:(__kindof NSObject *)moduleInstance
                                       forName:(NSString *)name
                                    usingBlock:(void(^)(NSNotification *notification))block;

/// 在一定范围内监听一组通知事件
/// @param moduleInstance 模块实例对象
/// @param names 通知名称数组
/// @param block 通知事件处理
- (void)jk_observeNotificationAtModuleInstance:(__kindof NSObject *)moduleInstance
                                      forNames:(NSArray<NSString *> *)names
                                    usingBlock:(void(^)(NSNotification *notification))block;                                

备注:其中moduleInstance是和某个类的实例对象,发送通知和接收通知的时候要保持一致
swift:

    /// 在一定范围内发送通知
    /// - Parameters:
    ///   - moduleInstance: 模块实例对象
    ///   - notificationName: 通知名字
    func jk_postNotification(at moduleInstance:Any, notificationName:String) -> Void
    
    /// 在一定范围内发送通知
    /// - Parameters:
    ///   - moduleInstance: 模块实例对象
    ///   - notificationName: 通知名字
    ///   - object: object
    ///   - userInfo: userInfo
    func jk_postNotification(at moduleInstance:Any, notificationName:String, object:Any?, userInfo:[AnyHashable : Any]?) -> Void

    /// 在一定范围内监听通知事件
    /// - Parameters:
    ///   - moduleInstance: 模块实例对象
    ///   - notificationName: 通知名字
    ///   - block: 通知事件处理
    func jk_observeNotification(at moduleInstance:Any, notificationName:String, block:@escaping ((_ notification:Notification) -> Void)) ->Void
    
    /// 在一定范围内监听通知事件
    /// - Parameters:
    ///   - moduleInstance: 模块实例对象
    ///   - notificationNames: 通知名字数组
    ///   - block: 通知事件回调
    func jk_observeNotifications(at moduleInstance:Any, notificationNames:Array<String>, block:@escaping ((_ notification:Notification) -> Void)) ->Void

备注:其中moduleInstance是和某个类的实例对象,发送通知和接收通知的时候要保持一致

pod集成命令如下:

OC:

pod 'JKNoticationHelper'

swift:

pod 'JKNoticationHelper_Swift'

源码下载地址:https://github.com/xindizhiyin2014/JKNoticationHelper.git
这里写图片描述

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:54:52  更:2021-09-20 15:55:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:59:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码