在调用应用程序:didBecomeActive(iOS)时,rootViewController是否始终准备好显示序列?

在调用应用程序:didBecomeActive(iOS)时,rootViewController是否始终准备好显示序列?,ios,loading,rootviewcontroller,Ios,Loading,Rootviewcontroller,我的应用程序在情节提要中具有rootViewController设置。我本来是问这个问题的,但我看得出现在问这个问题是错误的: rootViewController的viewdiload方法是否始终被调用 在应用程序之前:是否在应用程序代理中变为活动的?是吗 viewDidLoad方法始终在 application:didBecomeActive被调用,或者两者可以运行吗 同时 我可以运行测试,但我知道这些测试不考虑 每种情况。我想知道是否有硬性规定 这适用于这里,或者我可能是在处理种族问题 在

我的应用程序在情节提要中具有rootViewController设置。我本来是问这个问题的,但我看得出现在问这个问题是错误的:

rootViewController的
viewdiload
方法是否始终被调用 在
应用程序之前:是否在应用程序代理中变为活动的
?是吗
viewDidLoad
方法始终在
application:didBecomeActive
被调用,或者两者可以运行吗 同时

我可以运行测试,但我知道这些测试不考虑 每种情况。我想知道是否有硬性规定 这适用于这里,或者我可能是在处理种族问题 在某一点上的条件。据我所知,
viewDidLoad
rootViewController似乎在之前被调用并完成
application:didbecomeActive
被调用,但我无法确定 这是我可以信赖的

我使用的是iOS 11和Xcode 9


My rootViewController用于显示我的AppUpdate视图、密码视图、法律条款视图、handleImportedFile视图和tabbarcontroller。这就像是一个启动协调器,因为我的加载过程非常复杂。现在我正在移动用户的sqlite数据库的位置,我的一些用户的数据库是巨大的。它必须在后台完成,但在主队列上运行hud时,因为在完成此操作之前,应用程序无法显示数据。如果我在
应用程序:didFinishLaunchingWithOptions
期间执行此操作,则某些用户将获得看门狗计时器。因此,我想将加载过程移动到
应用程序:didBecomeActive
(我有一个标志来告诉我应用程序是否从已终止的服务器启动)。运行完成后,rootViewController将执行到相关视图的切换。但我认为rootViewController需要在那个时候加载,我不确定是否总是这样

基本上,在下面的代码中,我试图弄清楚导致rootViewController(我称之为masterController)执行segue的
[self.masterController showApplicableView]
是否在“安全的地方”调用,或者在任何情况下,此时让rootViewController执行segue可能还为时过早

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.masterController = (MasterViewController*)self.window.rootViewController;
    self.activatingFromTerminated = YES;

    return YES;
}

- (void)applicationWillEnterForeground:(UIApplication *)application {

    self.activatingFromTerminated = NO;
}

- (void)applicationDidBecomeActive:(UIApplication *)application {

    if (_activatingFromTerminated) {

        self.activatingFromTerminated = NO;

        [[CoreDataController sharedManager] loadStoreWithCompletionHandler:^(NSError * _Nullable error) {

            if ([CoreDataController sharedManager].storeLoaded) {

                [self.masterController showApplicableView];//performs applicable segue
            }
        }];
    }
}
据我所知,rootViewController的viewDidLoad似乎在调用应用程序之前被调用并完成:didbecomeActive被调用,但我不知道这是否是我可以依赖的

不是,你也不应该。你根本不应该担心这个。事实上,您认为您需要知道这在代码中是一种不好的味道。这些是来自两个完全不同的领域(应用程序和视图控制器)的生命周期事件,它们的相对时间应该与您无关。在每项活动中,都要做与该事件的含义相适应的事情

据我所知,rootViewController的viewDidLoad似乎在调用应用程序之前被调用并完成:didbecomeActive被调用,但我不知道这是否是我可以依赖的



不是,你也不应该。你根本不应该担心这个。事实上,您认为您需要知道这在代码中是一种不好的味道。这些是来自两个完全不同的领域(应用程序和视图控制器)的生命周期事件,它们的相对时间应该与您无关。在每项活动中,都要做与该事件的含义相适应的事情

为什么你想/需要依赖这个?这与看门狗定时器有关。您知道问题的答案吗?它们不能同时运行,因为它们都在主队列上运行。很抱歉,没有格式化这些方法。因此,我在rootViewController的viewDidLoad中添加了一个sleepForTimeInterval:100,并且应用程序:didBecomeActive在运行完成后才被调用。但这仍然不能告诉我是否可以在rootViewController的viewDidLoad之前调用application:didbecomeActive,对吗?老实说,如果你认为你需要知道这一点,那么你可能正在做一些你不应该做的事情。为什么你想/需要依赖它?这与看门狗定时器有关。您知道问题的答案吗?它们不能同时运行,因为它们都在主队列上运行。很抱歉,没有格式化这些方法。因此,我在rootViewController的viewDidLoad中添加了一个sleepForTimeInterval:100,并且应用程序:didBecomeActive在运行完成后才被调用。但这仍然不能告诉我application:didbecomeActive是否可以在rootViewController的viewDidLoad之前调用,对吗?老实说,如果你认为你需要知道这一点,那么你可能正在做一些你不应该做的事情。我的rootViewController用于显示我的AppUpdate视图、密码视图、法律条款视图,我的handleImportedFile视图和Tabbar控制器。这就像是一个启动协调器,因为我的加载过程非常复杂。现在,我正在将sqlite数据库位置从文档移动到应用程序支持目录,我的一些用户数据库非常庞大。必须在hud在主队列上运行时执行此操作,因为在完成此操作之前,应用程序无法显示数据。如果我在application:didFinishLaunchingWithOptions期间执行此操作,则某些用户将获得watchdog计时器。因此,我希望将进程移动到application:didBecomeActive(我有一个标志来告诉我应用程序是否从已终止的状态启动)。运行完成后,告诉rootViewController加载相关的视图。我明白你的意思,我只是不知道有什么更好的方法来处理这个复杂的加载过程以及在大型数据库上移动和进行轻量级迁移,所有这些都是在启动时进行的。如果我以错误的方式接近,我会喜欢思考如何更好地完成任务。当我给视频观看时,我应该说WWDC 2018 233。它有一个完整的部分专门介绍您的情况:当您进行som时的启动时间