0

我的应用在情节提要中有一个 rootViewController 设置。我最初问了这个问题,但我可以看到现在问的问题是错误的:

viewDidLoadrootViewController的方法是否总是application:didBecomeActive在应用程序委托中调用?该 viewDidLoad方法是否总是在 application:didBecomeActive调用之前完成,或者两者可以同时运行?

我可以运行测试,但我知道这些测试并没有考虑到所有情况。我想了解这里是否有适用的硬性规则,或者我是否可能在某个时候处理竞争条件。据我所知,viewDidLoadrootViewController 似乎在被调用之前被调用和完成 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
            }
        }];
    }
}
4

1 回答 1

4

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

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

于 2018-08-16T21:02:49.470 回答