在初始化第一个视图控制器之前运行代码(基于故事板的应用程序)

Nic*_*ari 5 uiviewcontroller ios uistoryboard appdelegate

我的应用程序需要执行一些清理任务 - 删除本地存储的旧数据 - 每次启动时,在显示初始视图控制器之前。

这是因为初始视图控制器在初始化时加载现有数据,并将其显示在表视图中。

我设置了几个断点,并发现初始视图控制器的初始化程序 ( init?(coder aDecoder: NSCoder)) 运行之前 application(_:didFinishLaunchingWithOptions)- 甚至之前application(_:**will**FinishLaunchingWithOptions),准确地说。

可以将清理代码放在视图控制器初始值设定项的最顶部,但我想将清理逻辑与任何特定屏幕分离。有一天,那个视图控制器可能最终不会成为最初的视图控制器。

覆盖应用程序委托的init()方法并将我的清理代码放在那里确实可以完成工作,但是......

题:

没有更好/更优雅的方式吗?


注:供参考,相关方法的执行顺序如下:

  1. AppDelegate.init()
  2. 视图控制器.init()
  3. AppDelegate.application(_:willFinishLaunchingWithOptions:)
  4. AppDelegate.application(_:didFinishLaunchingWithOptions:)
  5. ViewController.viewDidLoad()

澄清:

清理任务不冗长,也不需要异步运行:相反,我宁愿如果我的初始视图控制器甚至没有实例化,直到它完成(我清楚,如果它需要的系统会杀了我的应用程序启动时间很长。但是,它只是删除了一些本地文件,没什么大不了的。)。

我问这个问题主要是因为,在故事板出现之前,应用程序启动代码如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];

    // INITIAL VIEW CONTROLLER GETS INSTANTIATED HERE 
    // (NOT BEFORE):
    MyViewController* controller = [[MyViewController alloc] init];

    self.window.rootViewController = controller;

    [self.window makeKeyAndVisible];
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

...但现在,因为主故事板加载发生在幕后,视图控制器任何应用程序委托方法运行之前被初始化。

不是在寻找需要向我的初始视图控制器添加自定义代码的解决方案。

010*_*101 6

我不确定是否有更优雅的方式,但肯定还有其他一些方式......

我更喜欢我的初始视图控制器在完成之前甚至没有实例化

这不是问题。您所要做的就是从 中删除一个UIMainStoryboardFileNSMainNibFile键,Info.plist它告诉UIApplicationMain应该加载什么 UI。随后,您在 中运行“清理逻辑”,AppDelegate完成后您自己启动 UI,如示例中所示。

替代解决方案是UIApplicationMain在加载 UI 之前创建一个子类并在其中运行清理。

请参阅下面的应用程序生命周期

iOS 应用生命周期