Notification Once
2016-04-26 12:40
232 查看
前段时间整理项目中的
其实这些代码完全可以利用
解释:
block 版本的通知注册会产生一个
block 对 observer 对象的捕获早于函数的返回,所以若不加
nil
在 block 执行结束时移除 observer,无需其他清理工作
这样,在模块内部就完成了在程序启动点代码的挂载
值得注意的是,通知是在
顺便提下给 AppDelegate 瘦身的建议:AppDelegate 作为程序级状态变化的 delegate,应该只做路由和分发的作用,具体逻辑实现代码还是应该在分别的模块中,这个文件应该保持整洁,除了
AppDelegate,发现很多写在
- application:didFinishLaunchingWithOptions:中的代码都只是为了在程序启动时获得一次调用机会,多为某些模块的初始化工作,如:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // ... [FooModule setup]; [[BarModule sharedInstance] setup]; // ... return YES; } |
Notification的方式在自己的模块内部搞定,分享一个巧妙的方法:
/// FooModule.m + (void)load { __block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:nil usingBlock:^(NSNotification *note) { [self setup]; // Do whatever you want [[NSNotificationCenter defaultCenter] removeObserver:observer]; }]; } |
+ load方法在足够早的时间点被调用
block 版本的通知注册会产生一个
__NS 99b8 Observer *对象用来给外部 remove 观察者
block 对 observer 对象的捕获早于函数的返回,所以若不加
__block,会捕获到
nil
在 block 执行结束时移除 observer,无需其他清理工作
这样,在模块内部就完成了在程序启动点代码的挂载
值得注意的是,通知是在
- application:didFinishLaunchingWithOptions:调用完成后才发送的。
顺便提下给 AppDelegate 瘦身的建议:AppDelegate 作为程序级状态变化的 delegate,应该只做路由和分发的作用,具体逻辑实现代码还是应该在分别的模块中,这个文件应该保持整洁,除了
<UIApplicationDelegate>的方法外不应该出现其他方法。
相关文章推荐
- Docker1.11新特性
- Linux基础目录结构
- C/C++复习:学生信息的输出(结构体)
- Android图片压缩(质量压缩和尺寸压缩)
- Java使用OpenCV人脸检测
- Word文档不能编辑解决方法
- Codeforces Round #348(VK Cup 2016 - Round 2)
- 【搬运】实现一个有意思的TODO宏
- CSS div display:inline-block(转自最初的你的博客)
- [BS-10] 统一设置app所有页面的“返回”按钮样式
- 如何解决ajax跨域问题
- shader forge初级篇|属性设置
- Mysql-5.7.11-winx64安装步骤
- Java使用OpenCV
- 拨号器
- wince6下载地址
- P2P网络“自由”穿越NAT的“秘密”原理
- 【面试题解答】如何在一个对象释放的时候收到通知
- Android异步更新UI的几种方法
- zookeeper单节点的安装