iOS雨笙 NSNotification通知模式的原理及实现
2015-09-28 19:19
483 查看
NSNotification(通知模式),是界面间通信的一种方式.
这种模式的实现,是通过某一个界面去发送通知,其它任意数量的对象只要遵循某一种原则,都可以接收到这个通知消息.即使这些对象之间没有耦合关系.
用得到NSNotification(通知)的地方不是太多(最后会分析原因),比较常用的一种场景是"换皮肤",就是更换UITabBar,UINavigationBar的背景,以达到换肤的效果(下面会代码举例).我们先来分析一下NSNotification(通知)类.
NSNotification(通知),它封装了要广播的信息.NSNotificationCenter(通知中心),这个类管理注册接收消息对象,发送通知消息等.
通知的一个周期大体又分做三个流程.
首先要去触发这个通知事件,例如上面提到的"换皮肤",我们可以在某一个"不相干"的页面创建一个UIButton(代码省略),给这个UIButton添加一个button的点击事件,让这个button去触发通知事件,下面代码实现了发送通知,注意,NSNotificationCenter是单例类
这种模式的实现,是通过某一个界面去发送通知,其它任意数量的对象只要遵循某一种原则,都可以接收到这个通知消息.即使这些对象之间没有耦合关系.
用得到NSNotification(通知)的地方不是太多(最后会分析原因),比较常用的一种场景是"换皮肤",就是更换UITabBar,UINavigationBar的背景,以达到换肤的效果(下面会代码举例).我们先来分析一下NSNotification(通知)类.
NSNotification(通知),它封装了要广播的信息.NSNotificationCenter(通知中心),这个类管理注册接收消息对象,发送通知消息等.
通知的一个周期大体又分做三个流程.
首先要去触发这个通知事件,例如上面提到的"换皮肤",我们可以在某一个"不相干"的页面创建一个UIButton(代码省略),给这个UIButton添加一个button的点击事件,让这个button去触发通知事件,下面代码实现了发送通知,注意,NSNotificationCenter是单例类
// button的点击事件 // 发送通知 // 注意:postNotificationName:后面的名字(字符串)非常重要,和前面在注册时用到的名字必须一致(下面讲解) // userInfo携带的参数,类型是字典 - (void)actionButton:(UIButton *)button { [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATIONONE" object:self userInfo:@{@"UI":@"Over"}]; }然后我们想在哪个界面去接收到这个通知,就去哪个页面注册通知(多个页面也可以,但保证都要注册),注册也是一行代码,我们这里想改变根视图的背景颜色,所以要在AppDelegate.m中去注册这个通知:
// 注册一条通知,接受参数 // 通知的名字,最好是全大写,并且必须和前面发送通知时的名字一致 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (notification:) name:@"NOTIFICATIONONE" object:nil];下面实现notification:方法,在其中改变根视图的背景
// 实现接收通知的方法 - (void)notification:(NSNotification *)notification { // 1.把window的根视图控制器取出来 UIViewController *vc = self.window.rootViewController; // 2.把已经设置window的根视图控制器重置为空 self.window.rootViewController = nil; // 3.设置新皮肤 // 取出NavBar 和TabBar // 通过调用appearance取出要更改的bar UINavigationBar *navBar = [UINavigationBar appearance]; UITabBar *tabBar = [UITabBar appearance]; // 设置新的背景,如果这里有多条通知同时响应这个方法,可以通过实参notification中的name属性判定 [navBar setBarTintColor:[UIColor redColor]]; [tabBar setBarTintColor:[UIColor redColor]]; // 4.重新赋值window的根视图控制器 self.window.rootViewController = vc; // 这里还能取到发送通知时传过来的字典 NSDictionary *dic = not.userInfo; NSLog(@"我收到通知了 %@ 通知的名字 %@ object:%@",dic, not.name,not.object); }最后,如果已经注册的对象不需要接受信息时,在通知中心移除,移除的位置在dealloc中;
-(void)dealloc { // 销毁这条通知 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"NOTIFICATIONONE" object:nil]; [super dealloc]; }文章最后,我们说说NSNotification(通知)的优劣势.优势前面已经提到过,最大的优势就是可以一对多,即使对象之间没有耦合关系.那为什么不常用呢,一是因为代码的可读性比较差,不太容易寻找它们之间的联系.二是因为NSNotification(通知)这种方式不像代理一样注重返回的情况,通知模式下我只管发出通知,接不接收与我无关,怎样接收也与我无关,这就造成了通知的相对独立性,不能做到太好的前后照应,从整体性来看,还是存在一定的弊端.
相关文章推荐
- ios 自定义带占位文字(placeholder)的TextView
- iOS9.0.1给我带来的问题
- iOS适配各版本
- iOS bug收集
- ios编程--AVCapture编程理解
- 如何将你牛逼的iOS代码分享到CocoaPod(转)
- iOS开发之线程
- iOS开发--本地通知
- 理解iOS 8中的Self Sizing Cells和Dynamic Type
- ios 常用宏(copy)
- 如何设置 程序的未读图标标记
- github iOS源码
- iOS ShareSDK的新浪微博配置
- 很好的一篇关于xcode的学习文章
- iOS9 3D Touch iOS 教程 ShortcutItem使用
- iOS 传值问题总结
- iOS开发脚踏实地学习day17-彩票
- iOS常用第三方框架
- ios开发 -- AFNetworking用法
- 如何在LLDB下排查message sent to deallocated instance问题