美文网首页iOS常用
iOS 利用通知给AppDelegate瘦身

iOS 利用通知给AppDelegate瘦身

作者: YannChee | 来源:发表于2018-12-19 20:33 被阅读20次

    原文链接: 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>的方法外不应该出现其他方法

    相关文章

      网友评论

        本文标题:iOS 利用通知给AppDelegate瘦身

        本文链接:https://www.haomeiwen.com/subject/ridskqtx.html