Iphone iOS5如何;懒散地;是否初始化选项卡栏的控制器?

Iphone iOS5如何;懒散地;是否初始化选项卡栏的控制器?,iphone,objective-c,ios5,lazy-loading,uitabbar,Iphone,Objective C,Ios5,Lazy Loading,Uitabbar,我有一个TabBar控制器,最多有9个控制器,每个控制器都有一个导航控制器。目前,我在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{...} 这使得我的应用程序在第一次启动时需要相当长的时间才能启动。我希望通过延迟初始化来减少初始加载时间 当第一次为选项卡栏选择视图控制器时,是否有办法“延迟”初始化它们 查看iOS5的故事

我有一个TabBar控制器,最多有9个控制器,每个控制器都有一个导航控制器。目前,我在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{...}
这使得我的应用程序在第一次启动时需要相当长的时间才能启动。我希望通过延迟初始化来减少初始加载时间

当第一次为选项卡栏选择视图控制器时,是否有办法“延迟”初始化它们

查看iOS5的故事板是否有助于解决这个问题


谢谢大家!

将控制器定义为惰性控制器怎么样

我的意思是,如果由于九个视图控制器的初始化,应用程序需要一些时间才能启动,那么这与控制器在初始化时的实际操作有关。因此,您可以分两步使控制器惰性地初始化:第一步,将所有控制器添加到选项卡栏控制器时;第二,当您选择一个特定的选项卡时,相应的控制器就会初始化

我认为这是最干净的方法

否则,我会直接使用
UITabBar
在您自己的选项卡栏控制器类中管理它

作为最后一个选项,我将根据一些逻辑在适当的时间调用
setViewControllers:animated:
,尝试动态更改选项卡栏控制器的内容。例如,您可以在
应用程序:didFinishLaunchingWithOptions:
中仅使用5个视图控制器初始化选项卡栏控制器,然后稍后添加其余的视图控制器

但我的实际建议是让组件控制器变得懒惰

编辑:阅读评论中的问题后

如果您想尝试延迟控制器的初始化,我的意思是:

  • 您将通过调用[[…alloc]init…]初始化控制器(或加载nib时UIKit将初始化控制器);这并没有改变

  • init
    方法将控制器初始化为默认状态,如设置属性和ivar值,并且不执行更复杂的操作

  • 在显示控制器视图之前,通过调用特定方法完成其初始化;这将完成“相当多的授权”部分,我认为这是初始化的冗长部分

  • 抱歉,如果谈论“延迟初始化”导致组件的逻辑初始化和
    init
    方法的内容不明确

    至于第3点,您有几个关于在何处完成初始化的选项

    可能是控制器即将显示时。在这种情况下,您可以在选项卡栏控制器委托中定义
    -tabBarController:didSelectViewController:
    ,或者使用
    viewwillbeen
    。这将为您提供最延迟的初始化,但在视图出现之前选择选项卡的确切时刻可能会增加一些延迟

    更好的方法是使用
    viewDidLoad
    ,这样可以减少延迟初始化;所有控制器的初始化都会发生在您无法控制的某个时间点(当然,在显示视图之前),因此可能会稍微延迟一些时间,但不会发生在
    applicationdFinishLoading
    中,而且会更方便用户界面,因为它将由主循环控制。当然,第一个选择是尝试。另请查看中的
    viewDidLoad
    说明


    最后是关于独立线程的注释。请记住,从单独的线程使用
    UIKit
    并非完全安全,因此要小心。

    在UIViewController的实现中,在方法中创建所有视图

    - (void)viewDidLoad
    
    并避免在init方法中创建视图(甚至更糟的是获取数据)


    UITabBarController或UINavigationController默认情况下会在用户看到viewDidLoad之前调用它。

    感觉像是在这个问题上添加了一个快速的.02。正如其他人所指出的,UIViewController初始化和加载过程已经是“懒惰的”。真正的问题是,在花了这么长时间的初始化过程中,您在做什么?即使加载视图也不会花费很长时间,因为您不希望用户在点击选项卡时等待视图更改。我建议如下:

  • 在init中,尽可能少地执行操作。init的目的是初始化和准备任何独立于视图的数据。您不应该在此处加载任何视图

  • loadView
    viewDidLoad
    中创建所有视图/子视图

  • 仅在需要时加载数据。如果在init中需要它,请将其加载到那里。如果可以等待视图加载,请在
    viewDidLoad
    中执行此操作。如果加载数据需要很长时间,请在后台加载数据


  • 它应该不会花那么长的时间来分配初始化您的ViewController。您可能需要对它们进行优化,并确保这些ViewController延迟加载其资源。。。提示:ViewDidAppari认为以编程方式创建视图的合适位置是
    -[UIViewController loadView]
    ,而不是
    -[UIViewController viewDidLoad]
    。在Xcode 4.x中,创建新的UIViewController子类时,我得到的只是init和viewDidLoad。我可以确认viewDidLoad被延迟调用。关于动态设置视图控制器的好主意!我注意到,由于我的控制器在“更多”选项卡上溢出,用户可以选择编辑控制器的顺序。我不知道通过应用程序重新启动,订单重新排列是否会持续。如果是这样的话,这是一个很酷的特性,我不想丢失。我所有的视图控制器都是从NIB创建的,并且有很多委托正在进行。如果我错了,请纠正我,一个只被分配的对象只是一堆内存,所以我还不能分配它的属性。其中一件事