??在实际的开发中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
|