2

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

基本上我有

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

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

强制视图加载的原因是我还在并行线程中执行一些网络请求,一旦这些请求完成,我想用这些视图设置很多东西。

我的问题是:我如何找出我的笔尖的哪些部分花了这么长时间,以及在不完全重写整个应用程序的情况下优化它的最佳策略是什么(目前)?

4

2 回答 2

3

首先要做的是在没有直接证据的情况下假设笔尖加载是瓶颈。笔尖加载经过高度优化且非常高效。您的瓶颈更有可能是网络请求而不是笔尖。在您执行任何操作之前,使用 Instruments 获取有关应用程序花费时间的具体数据。

假设它是笔尖,Andiih 的答案是分析的最佳选择,但在我看来,您确实遇到了设计问题。

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

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

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

笔尖只是轻量级的数据文件,所以不要害怕创建 99% 相同的笔尖。例如,我经常为每个纵向和横向视图使用单独的视图。从用户的角度来看,这是一个视图,但我有三个单独的笔尖。如果使用完全独立的视图比旋转单个复杂视图更容易,我会这样做。每个笔尖在使用其方向时被加载。如果方向永远不会改变,则永远不会加载。

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

于 2010-05-18T12:40:24.840 回答
1

我不知道这是否真的有效,但是您可以将日志记录语句放在每个控制器的 initWithCoder 中,这些语句将在每个子 xib 加载时被调用。这可能会给你一些线索。

我猜仪器没有给你任何有用的东西?

于 2010-05-18T12:13:04.587 回答