2

我正在使用 Core Data 创建一个相当复杂的 iPhone 应用程序。到目前为止,一切都运行良好。然而,随着应用程序变得越来越复杂,出现了一个新问题:第一个视图控制器在 AppDelegate 完成其 applicationDidFinishLaunching 方法之前完成了它的 viewDidLoad 方法。

视图控制器不是根,它是一个标签栏控制器。有问题的 VC 是选项卡栏上默认选择的选项卡。它被 IB 实例化。

根据我的经验,以前没有发生过这样的事情,并且它抛弃了我在 AppDelegate 中所做的重要初始化(从 Core Data 获取对象并准备它们以供使用)。此外,它是间歇性的——有时代表确实先完成。

有没有其他人注意到这样的困难?任何处理此类问题的示例代码?

我想答案是让 VC 加载 AppDelegate 准备好的数据,只有当 AppDelegate 发送一条消息它已经准备好时。我有点担心这会增加一些东西,以后只会咬我的屁股。

4

2 回答 2

1

我用来避免这种竞争条件的解决方案是完全放弃引用应用程序的任何功能 UI,直到数据被加载和验证。在我的 -applicationDidFinishLaunching: 方法的顶部,我执行以下操作:

  1. 创建一个带有子视图的 UIWindow:
    • Default.png 的 UIImageView 和一个子视图:
      • 以框架为中心的 UIActivityIndi​​catorView(和动画)
  2. 设置窗口键和可见键,以便用户尽快获得视觉反馈,即在 UI 加载之前正在进行一些数据处理。
  3. 完成所有数据加载和验证(可能包括网络活动)
  4. 创建 UI 的主视图并将其作为 Default.png 视图正下方的子视图添加到窗口,然后将其淡出并从其父视图中删除。

如何实现第 4 步(子程序调用、异步通知、键值观察等)完全取决于您。重要的是使任何 UI 组件的加载取决于任何所需数据组件的加载。

这使您可以编写所有 UI 代码而不必担心数据,这就是您希望在 MVC 应用程序中执行的操作。

于 2010-03-13T09:36:02.833 回答
0

一旦应用程序委托初始化完成,触发一个NSNotification——这可能是该applicationDidFinishLaunching方法要做的最后一件事。

让同一个应用程序委托监听该通知并触发一个选择器,比如loadViewController,然后加载视图控制器。

于 2010-03-12T23:10:37.890 回答