现象

- application:didFinishLaunchingWithOptions:中,有很多初始化自己和一些第三方服务的代码,比较混乱,耦合度很大.随着业务的增加会越发明显.

目的

  1. 解耦.模块分工明确.
  2. 给AppDelegate瘦身.让AppDelegate只负责它应该负责的事情:UIApplicationDelegate

解决方案

UIApplication中,有一系列的通知Key,其中UIApplicationDidFinishLaunchingNotification就是我们所需要的.假设我们要初始化LogSystemService,LogSystemService需要在- application:didFinishLaunchingWithOptions:之前注册通知.所以我们要用到NSObject+ (void)load方法,根据苹果文档,只要类所在文件被引用就会被调用.

示例

1
2
3
4
5
6
7
8
9
10
__block NSObject *observer = 
[[NSNotificationCenter defaultCenter]
addObserverForName:UIApplicationDidFinishLaunchingNotification
object:nil
queue:nil
usingBlock:^(NSNotification notification)
{
[self setupDDLog];
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}];

注意

  • block 对 observer 对象的捕获早于函数的返回,所以若不加__block,会捕获到 nil
  • 若要获取到launchOptions,notification中的userInfo即为launchOptions.NSDictionary *launchOptions = [notification userInfo];