当应用程序启动到后台时,是否应该调用 viewcontroller llfecycle 事件?

问题描述

我一直都知道window?.makeKeyAndVisible()要在didFinishLaunching内完成

但我也认为根视图控制器的生命周期事件不会被调用,直到应用程序被前景化。想法不正确吗?

即通过调用 makeKeyAndVisible — 即使应用程序仅在后台启动,我也会看到它的 viewDidLoadviewWillAppearviewDidAppear 方法被调用。

这是预期的吗?!

解决方法

是的,有点。 “出现”并不意味着“用户即将看到它”。这意味着“正在组装视图控制器层次结构,并且此视图控制器的视图正在进入层次结构”。无论我们是在前台还是后台启动,视图控制器调用应该是稳定的。

(要看到这一点,请想象相反;一切都会崩溃!启动正在启动,视图控制器就是视图控制器;您必须获得预期的事件,否则应用程序会崩溃。) >


但是让我在这里发出更强烈的警告,因为我有肥皂盒。不要对两个不同的生命周期如何相互交错做出任何假设。 app 生命周期稳定,视图控制器生命周期稳定,但它们之间的交错方式因主要系统而异 em> 从架构到架构(“架构”是指您是否使用导航控制器等很重要)。

我在这方面有很多历史。当我第一次开始为 iOS 编程时,我发现这是交错顺序:

  • application(_:didFinishLaunchingWithOptions:)
  • viewDidLoad
  • viewWillAppear(_:)
  • applicationDidBecomeActive(_:)
  • viewDidAppear(_:)

根据该顺序,我通常使用根视图控制器的 viewDidAppear(_:) 来注册 UIApplication.didBecomeActiveNotification,以便在应用的后续激活通知。

这几年效果很好。但 iOS 8 带来了重大变化:应用程序委托现在收到 applicationDidBecomeActive(_:) 根视图控制器收到 viewDidAppear(_:),如下所示:

  • application(_:didFinishLaunchingWithOptions:)
  • viewDidLoad
  • viewWillAppear(_:)
  • viewDidAppear(_:)
  • applicationDidBecomeActive(_:)

这对我的许多应用来说都是一场灾难,因为我刚刚在 viewDidAppear(_:) 中注册的通知立即到达。

然后,在 iOS 9 中,顺序又回到了 iOS 7 和之前的状态——再次让我的应用程序陷入混乱。然后,在 iOS 11 中,顺序又恢复到了 iOS 8 中的顺序!

道德是你不应该像我一样依赖不同对象的生命周期事件之间的时间关系。我所做的总是错误。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...