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

Posted JackLee18

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于iOS开发如何限制NSNotification的作用范围的主要内容,如果未能解决你的问题,请参考以下文章

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

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

关于iOS开发中NSNotification

iOS开发中NSNotification的便利使用

iOS开发中NSNotification的便利使用

iOS开发中NSNotification的便利使用