我的应用在情节提要中有一个 rootViewController 设置。我最初问了这个问题,但我可以看到现在问的问题是错误的:
viewDidLoad
rootViewController的方法是否总是application:didBecomeActive
在应用程序委托中调用?该viewDidLoad
方法是否总是在application:didBecomeActive
调用之前完成,或者两者可以同时运行?我可以运行测试,但我知道这些测试并没有考虑到所有情况。我想了解这里是否有适用的硬性规则,或者我是否可能在某个时候处理竞争条件。据我所知,
viewDidLoad
rootViewController 似乎在被调用之前被调用和完成application:didbecomeActive
,但我不知道这是否是我可以依赖的东西。我正在使用 iOS 11 和 Xcode 9。
我的 rootViewController 用于显示我的 appUpdating 视图、密码视图、我的法律条款视图、我的 handleImportedFile 视图和我的 tabbarcontroller。它就像一个启动协调器,因为我的加载过程非常复杂。现在我正在移动用户的sqlite数据库的位置,而我的一些用户的数据库很大。它必须在后台完成,但是当 hud 在主队列上运行时,因为应用程序在完成之前无法显示数据。如果我在 期间这样做application:didFinishLaunchingWithOptions
,一些用户会得到看门狗计时器。所以我想将加载过程移至application:didBecomeActive
(我有一个标志告诉我应用程序是否从终止启动)。当它完成运行时,rootViewController 对相关视图执行 segue。但我认为 rootViewController 需要在那个时候加载,我不确定情况是否总是如此。
基本上,在下面的代码中,我试图找出[self.masterController showApplicableView]
导致 rootViewController(我称之为 masterController)执行 segue 的是否在“安全的地方”被调用,或者在任何情况下,它是否可能是此时让 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
}
}];
}
}