View Controller 的 viewDidLoad 方法在 applicationDidFinishLaunching 之前完成
-
19-09-2019 - |
题
我正在使用 Core Data 创建一个相当复杂的 iPhone 应用程序。到目前为止,一切进展顺利。然而,随着应用程序变得越来越复杂,一个新问题出现了:第一个视图控制器在 AppDelegate 完成其 applicationDidFinishLaunching 方法的一半之前完成其 viewDidLoad 方法。
视图控制器不是根控制器,它是一个选项卡栏控制器。所讨论的 VC 是选项卡栏上默认选择的选项卡的 VC。它正在被 IB 实例化。
根据我的经验,以前从未发生过类似的情况,并且它放弃了我在 AppDelegate 中所做的重要初始化(从 Core Data 获取对象并准备使用它们)。此外,它是间歇性的——有时代表 做 先完成。
还有其他人注意到这样的困难吗?有处理此类问题的示例代码吗?
我认为答案是让 VC 仅在 AppDelegate 发送准备就绪的消息时才加载 AppDelegate 准备就绪的数据。我有点担心这添加的东西最终会在以后咬我的屁股。
解决方案
我用来避免此类竞争条件的解决方案是完全放弃引用应用程序的任何功能 UI,直到加载并验证数据为止。在我的 -applicationDidFinishLaunching 的顶部:方法,我执行以下操作:
- 创建一个带有子视图的 UIWindow:
- 带有子视图的 Default.png 的 UIImageView:
- 位于框架中心的 UIActivityIndicatorView(并且具有动画效果)
- 带有子视图的 Default.png 的 UIImageView:
- 设置窗口键和可见,以便用户尽快获得视觉反馈,表明在 UI 加载之前正在进行一些数据处理。
- 完成所有数据加载和验证(可能包括网络活动)
- 创建 UI 的主视图并将其添加到窗口中,作为 Default.png 视图正下方的子视图,然后该视图会淡出并从其超级视图中删除。
如何实现第 4 步(子例程调用、异步通知、键值观察等)完全取决于您。重要的是让任何 UI 组件的加载取决于任何所需数据组件的加载。
这使您可以编写所有 UI 代码,而不必担心数据,这正是您希望在 MVC 应用程序中执行的操作。
其他提示
在应用程序的委托初始化完成后,触发一个NSNotification
- 这将是最后一件事applicationDidFinishLaunching
方法做,大概。
具有相同的应用程序委托侦听该通知和触发一个选择器,说loadViewController
,然后加载视图控制器。