Notification Once为AppDelegate瘦身
2016-04-13 17:40
375 查看
Notification Once
前段时间整理项目中的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 版本的通知注册会产生一个
__NSObserver *对象用来给外部 remove 观察者
block 对 observer 对象的捕获早于函数的返回,所以若不加
__block,会捕获到
nil
在 block 执行结束时移除 observer,无需其他清理工作
这样,在模块内部就完成了在程序启动点代码的挂载
值得注意的是,通知是在
- application:didFinishLaunchingWithOptions:调用完成后才发送的。
顺便提下给 AppDelegate 瘦身的建议:AppDelegate 作为程序级状态变化的 delegate,应该只做路由和分发的作用,具体逻辑实现代码还是应该在分别的模块中,这个文件应该保持整洁,除了
<UIApplicationDelegate>的方法外不应该出现其他方法。
原文地址:http://blog.sunnyxx.com/2015/03/09/notification-once/
相关文章推荐
- 闲云笔记——Android
- iOS 警告收录及科学快速的消除方法
- android之Notification实现
- Struts2的There is not Action mapped for namespace [/] 错误
- Android应用锁之获取栈顶Activity
- iOS 视频直播
- [iuud8]ios不同版本下推送本地通知
- android通用JSON解析
- Object类型
- JSONObject与JSONArray的使用
- Java之—— java mail 发送邮件 no object DCH for MIME type multipart/mixed 之正解
- 关于CocoaPods的安装总结
- iOS开发小记:关于环信Demo3.0的使用总结以及昵称和头像问题的研究与解决
- iOS通讯录开发
- 一步步调试解决iOS内存泄漏
- 如何关闭android的一个service
- iOSApp -Monkey测试
- Objective-C与Java面向对象对比学习(一)
- 消除“Permission is only granted to system apps”错误 .
- cordova开发插件步骤及小结(android插件)