iOS开发如何限制NSNotification的作用范围

本文介绍了一种局部使用NSNotification的方法,包括在特定类及其实例对象范围内发送与接收通知的技术细节,并提供了Objective-C与Swift的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在实际的开发中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
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值