在applicationDidFinishLaunching之前查看Controller的viewDidLoad方法

时间:2010-03-12 22:28:49

标签: iphone cocoa-touch uiviewcontroller uiapplicationdelegate

我正在使用Core Data创建一个相当复杂的iPhone应用程序。到目前为止,事情一直很好。然而,随着应用程序变得越来越复杂,出现了一个新问题:第一个视图控制器正在完成其viewDidLoad方法,然后AppDelegate甚至在其applicationDidFinishLaunching方法的中途。

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

根据我的经验,之前没有发生这样的事情,它正在抛弃我在AppDelegate中进行的重要初始化(从Core Data获取对象并准备使用它们)。此外,它是间歇性的 - 有时代理 首先完成。

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

我想答案是,只有当AppDelegate发送消息准备就绪时,VC才会加载AppDelegate准备好的数据。我有点担心这会增加一些东西,这些东西最终会在我的屁股上咬我。

2 个答案:

答案 0 :(得分:1)

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

  1. 使用子视图创建UIWindow:
    • 带有子视图的Default.png的UIImageView:
      • 以帧为中心的UIActivityIndi​​catorView(和动画)
  2. 设置窗口键并且可见,以便用户尽快获得视觉反馈,以便在UI加载之前进行一些数据处理。
  3. 完成所有数据加载和验证(可能包括网络活动)
  4. 创建UI的主视图并将其添加到Default.png视图正下方的子视图,然后淡出并从其超级视图中删除。
  5. 如何实施第4步(子程序调用,异步通知,键值观察等)完全取决于您。重要的是根据加载任何所需数据组件来加载任何UI组件的想法。

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

答案 1 :(得分:0)

一旦app委托初始化完成,就触发NSNotification - 这可能是applicationDidFinishLaunching方法最后做的事情。

让同一个app delegate侦听该通知并触发一个选择器,比如loadViewController,然后加载视图控制器。