代码之家  ›  专栏  ›  技术社区  ›  Joonas Trussmann

加快从iPhone上的NIBS加载UI的速度

  •  2
  • Joonas Trussmann  · 技术社区  · 14 年前

    首先,我意识到这个应用程序有一些设计问题,当重写其中的一大块可能会解决我的问题时,我正在寻找一种方法来让事情变得更快。

    基本上我有

    viewController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
    viewController.view;
    

    其中myviewcontroller.xib是一个相当复杂的NIB文件,其中包含许多相互交织的控制器和视图,其中一些当然从其他NIB加载它们的视图和层次结构,但肯定不是全部。这需要大约7秒的时间加载,考虑到这是一个iPhone应用程序,这是一个非常长的时间。

    强制加载视图的原因是我也在并行线程中执行一些网络请求,一旦这些请求完成,我想用这些视图设置相当多的内容。

    我的问题是:我如何才能知道我的笔尖的哪些部分需要这么长的时间,以及在不完全重写整个应用程序(目前)的情况下,优化这一点的最佳策略是什么?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Community Bayu Bramantya    7 年前

    首先要做的是不要假定NIB加载是瓶颈,而没有直接的证据证明它是瓶颈。笔尖加载是高度优化和非常有效的。您的瓶颈更有可能是网络请求,而不是NIB。在你做任何事情之前,使用工具获取关于应用程序在哪里花费时间的具体数据。

    假设是笔尖, Andiih answer 是最好的分析,但在我看来,你真的有一个设计问题。

    听起来你需要把你的大笔尖分成小笔尖。

    每个笔尖有一个视图是很常见的。例如,假设您有一个应用程序,它有一个带有五个选项卡的选项卡。然后每个选项卡都有一个表视图,可以打开一个详细视图。在正常设置中,您将有11个独立的笔尖。一个笔尖将定义选项卡,每个选项卡视图一个笔尖,然后每个细节视图一个笔尖。当应用程序启动时,只有标签条和第一个可见标签的笔尖会被加载,所以您只会加载11个笔尖中的两个。

    要优化,首先要做的是将其分解为尽可能小的单个笔尖。一个笔尖只在需要时加载。您应该将功能放在整个NIB中,这样,如果不立即显示NIB的视图,就不会加载该NIB。

    NIB只是轻量级的数据文件,所以不要害怕创建99%相同的NIB。例如,我经常对每个纵向和横向视图使用单独的视图。对于用户来说,它是一个视图,但我有三个独立的笔尖。我这样做的情况下,它很容易使用一个完全独立的视图,而不是旋转一个单一的复杂视图。每个笔尖在使用其方向时加载。如果方向不变,则不会加载。

    如果您有一个复杂的接口,它会根据网络请求发生显著的变化,那么在运行时为每个变化单独设置NIB的速度将比将所有功能塞进一个NIB的速度更快。

        2
  •  1
  •   Andiih    14 年前

    我不知道这是否真的有效,但是您可以在每个控制器中的initwitcoder中放入日志语句,该控制器将作为每个子XIB负载调用。这可能会给你一些线索。

    我想仪器不会给你任何有用的东西吗?