zoukankan      html  css  js  c++  java
  • Notification Once

    Notification Once

    前段时间整理项目中的AppDelegate,发现很多写在- application:didFinishLaunchingWithOptions:中的代码都只是为了在程序启动时获得一次调用机会,多为某些模块的初始化工作,如:

    1
    2
    3
    4
    5
    6
    7
    8
    
    - (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // ...
        [FooModule setup];
        [[BarModule sharedInstance] setup];
        // ...
        return YES;
    }
    

    其实这些代码完全可以利用Notification的方式在自己的模块内部搞定,分享一个巧妙的方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    /// 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>的方法外不应该出现其他方法。

  • 相关阅读:
    从BATS交易所获取空头头寸
    用cython提升python的性能
    用Python编写的第一个回测程序
    Omi框架学习之旅
    Omi框架学习之旅
    AlloyTouch.js 源码 学习笔记及原理说明
    AlloyFinger.js 源码 学习笔记及原理说明
    Git 学习笔记
    从数组中每次取一个不同的数组成员 getRandomItem(arr)
    move.js 源码 学习笔记
  • 原文地址:https://www.cnblogs.com/wq-gril/p/4725626.html
Copyright © 2011-2022 走看看