iOS 利用通知给AppDelegate瘦身

原文链接: http://blog.sunnyxx.com/2015/03/09/notification-once/

开发中发现AppDelegate中的代码非常多,主要原因是很多初始化配置的代码都写在了 - application:didFinishLaunchingWithOptions: 中

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // ...
   // 设置rootViewController ...
  // 初始化推送SDK....
  // 初始化 统计SDK
  // 初始化支付SDK
  // 初始化 第三方登录SDK
  // 其它配置.....
  // ...
    return YES;
}

后来,我想到给AppDelegate 增加若干分类,把各种初始化配置的方法写在各个对应的分类中,然后新建一个 总的分类,在总的分类里写一个总的初始化方法,调用这些零散初始化方法,再在AppDelegate.m中impor这个总的分类 调用总的初始化方法.
这个的确是个好办法,但是还是不够优雅,因为AppDelegate.m还需要import 分类文件,造成依赖.
最近看了一篇文章,发现还有更好的办法,那就是: 利用UIApplicationDidFinishLaunchingNotification通知.

// 在各自对应的模块中重写 + load方法,监听UIApplicationDidFinishLaunchingNotification通知
+ (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>的方法外不应该出现其他方法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,142评论 1 32
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 2,194评论 0 12
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,348评论 0 11
  • 1.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作...
    曾令伟阅读 1,080评论 0 10
  • 期待已久的18号马上就要到了!虽然是二次预售,但还是灰常的激动。
    任晓玉阅读 181评论 0 0