博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简化通知中心的使用
阅读量:5060 次
发布时间:2019-06-12

本文共 4939 字,大约阅读时间需要 16 分钟。

简化通知中心的使用

 

 

说明

1. 简化通知中心,笔者曾经实现过不需要移除的通知中心,基于弱引用集合(相对于强引用集合如NSArray,NSDictionary等)编写,本例子并无太多新意

2. 简化的通知中心由一个对象组织控制,不需要你手动移除被监听的对象,这是唯一的一点点有新意的地方

3. 在处理接收通知对象的地方,笔者提供了一个方法来简化取值操作,相对应的,发送通知消息的时候,被发送的对象也请使用指定的格式(都是用weak修饰,无需担心被持有)

 

源码

////  NotificationCenterObject.h//  NotificationCenter////  Created by YouXianMing on 15/7/15.//  Copyright (c) 2015年 YouXianMing. All rights reserved.//#import 
@interface PostObject : NSObject@property (nonatomic, strong) NSString *flag;@property (nonatomic, weak) id data;/** * 便利构造器初始化对象 * * @param flag 识别标签 * @param data 数据 * * @return 实例对象 */+ (instancetype)postObjectWithFlag:(NSString *)flag data:(id)data;/** * 处理通知中心事件 * * @param sender 通知中心的通知对象 * * @return 实例对象 */+ (instancetype)accessNotificationCenterObject:(id)sender;@end///@interface NotificationCenterObject : NSObject/** * === 必须先使用此方法进行初始化 === * * 初始化通知中心 * * @param observer 观察对象 * @param name 注册标签 * @param selector 执行用selector * * @return 实例对象 */+ (instancetype)withObserver:(id)observer registerName:(NSString *)name selector:(SEL)selector;/** * 给指定注册标签发信息 * * @param name 注册标签 * @param postData 发送的对象 */+ (void)postToRegisterName:(NSString *)name data:(PostObject *)postData;@property (nonatomic, readonly, strong) NSString *name;@property (nonatomic, readonly, weak) id observer;/** * 移除 */- (void)remove;/** * 重新添加上 */- (void)reAdd;@end////** * 创建通知对象 * * @param flag 标签 * @param data 传递的数据 * * @return 通知对象 */static inline PostObject * POST_OBJECT(NSString *flag, id data) { return [PostObject postObjectWithFlag:flag data:data];}/** * 处理通知的对象 * * @param sender 接收的通知对象 * * @return 通知对象 */static inline PostObject * ACCESS_POST_OBJECT(id sender) { return [PostObject accessNotificationCenterObject:sender];}/** * 发送通知消息 * * @param name 指定的标签 * @param postObject 通知的对象 * */static inline void POST_MSG_TO(NSString *name, PostObject *postObject) { [NotificationCenterObject postToRegisterName:name data:postObject];}/** * 注册通知中心 * * @param name 指定的标签 * @param observer 被注册的对象 * @param selector 执行的句柄 * * @return 实例对象 */static inline NotificationCenterObject * REGISTER_MSG_CENTER_WITH(NSString *name, id observer, SEL selector) { return [NotificationCenterObject withObserver:observer registerName:name selector:selector];}
////  NotificationCenterObject.m//  NotificationCenter////  Created by YouXianMing on 15/7/15.//  Copyright (c) 2015年 YouXianMing. All rights reserved.//#import "NotificationCenterObject.h"@implementation PostObject+ (instancetype)postObjectWithFlag:(NSString *)flag data:(id)data {    PostObject *postObject = [PostObject new];    postObject.flag        = flag;    postObject.data        = data;        return postObject;}+ (instancetype)accessNotificationCenterObject:(id)sender {    PostObject *postData = nil;        if ([sender isKindOfClass:[NSNotification class]]) {            NSNotification *notiData = sender;                if ([notiData.object isKindOfClass:[PostObject class]]) {                        postData = notiData.object;        }    }        return postData;}@end@interface NotificationCenterObject ()@property (nonatomic, strong) NSString *name;@property (nonatomic, weak)   id        observer;@property (nonatomic)         SEL       observerSelector;@property (nonatomic)         BOOL      haveAddObserver;@end@implementation NotificationCenterObject+ (void)postToRegisterName:(NSString *)name data:(PostObject *)postData {    [[NSNotificationCenter defaultCenter] postNotificationName:name object:postData];}+ (instancetype)withObserver:(id)observer registerName:(NSString *)name selector:(SEL)selector {    NotificationCenterObject *notificationCenterObject = [NotificationCenterObject new];    notificationCenterObject.name                      = name;    notificationCenterObject.observer                  = observer;    notificationCenterObject.observerSelector          = selector;        notificationCenterObject.haveAddObserver           = YES;    [[NSNotificationCenter defaultCenter] addObserver:observer selector:selector name:name object:nil];        return notificationCenterObject;}- (void)remove {    if (self.haveAddObserver == YES && _name && _observer) {        self.haveAddObserver = NO;        [[NSNotificationCenter defaultCenter] removeObserver:_observer name:_name object:nil];    }}- (void)reAdd {    if (self.haveAddObserver == NO && _name && _observer) {        self.haveAddObserver = YES;        [[NSNotificationCenter defaultCenter] addObserver:_observer selector:_observerSelector name:_name object:nil];    }}- (void)dealloc {        if (self.haveAddObserver == YES) {                NSLog(@"已经释放");        [[NSNotificationCenter defaultCenter] removeObserver:_observer name:_name object:nil];    }}@end

 

细节

用内联函数将OC风格函数简化为C风格函数,能够稍微缩短代码编写长度,其实并无实用价值,装的成分居多。

 

转载于:https://www.cnblogs.com/YouXianMing/p/4649772.html

你可能感兴趣的文章
WPF中实现多选ComboBox控件
查看>>
读构建之法第四章第十七章有感
查看>>
C#中的IEnumerable<T>知识点
查看>>
android访问链接时候报java.net.MalformedURLException: Protocol not found
查看>>
dwz ie10一直提示数据加载中
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
Windows Phone Marketplace 发布软件全攻略
查看>>
Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)【转】
查看>>
语义web基础知识学习
查看>>
hexo个人博客添加宠物/鼠标点击效果/博客管理
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
关于WPF的2000件事 02--WPF界面是如何渲染的?
查看>>
单元测试、、、
查看>>
SVN使用教程总结
查看>>
JS 浏览器对象
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
虚拟中没有eth0
查看>>
Unity 3D游戏开发学习路线(方法篇)
查看>>
BZOJ2049[Sdoi2008]Cave 洞穴勘测(LCT模板)
查看>>