2

我正在使用以下代码加载一堆 UIImages(它们是本地的并与应用程序一起预加载):

NSString*plistPath = [[NSBundle mainBundle] pathForResource:@"images" ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:plistPath];
NSMutableArray *finalArray = [[NSMutableArray alloc] initWithCapacity:array.count];
for(int i=0;i<array.count; i++) {
    [finalArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%@",[array objectAtIndex:i]]]];
}

然后在collectionView中:

cell.cellImage.image = [finalArray objectAtIndex:indexPath.row];

该collectionView的呈现存在巨大滞后。我用以下仪器屏幕截图捕捉到了这种滞后:

在此处输入图像描述

该延迟(由用户体验并显示在图表中)与下面的实际调用树之间存在重大脱节,显示没有延迟。我在 collectionView 的每个单元格中加载 500k jpg。这个仪器分析基本上是说我在代码中无能为力,这是系统库延迟吗?

编辑:我的问题不再是关于我的 collectionView 的这个特定用例。一般是关于仪器的。如果我在屏幕截图中选择了选项并且应用程序显示明显滞后,但时间分析器没有,我可以在我的代码中做些什么来提高速度吗?我想我更一般地询问时间分析器、设置及其结果。如果所有的延迟都归因于较低级别的代码或系统框架,我能做些什么吗?

4

3 回答 3

3

Hide System Libraries在右侧设置面板中启用了复选框,因此它将隐藏对您未定义的方法的任何调用。因此,例如,如果您进行大量调用imageNamed:并选中此复选框,您将看不到系统解压缩和加载这些图像所花费的时间。

因此,从技术上讲,所有“滞后”/缓慢都在系统框架中,但您可以控制更改使用它们的方式。您还可以监控系统框架中的哪些操作在时间上是最昂贵的。

取消选中此框是解决方案:

取消选中此框

于 2013-02-18T16:23:00.607 回答
2

imageNamed:将缓存您的图像。用于imageWithContentsOfFile:避免缓存。
希望这会加快您的加载速度。

于 2013-02-05T17:41:05.770 回答
1

您是否将它们加载到后台/单独的线程上,如果没有,那么请这样做将解决您的问题并将它们加载到队列中。因此,一旦加载图像,通知将使用它的对象并将图像对象传递给它。

创建一个简单的 NSOperation 加载图像并通知分配给它的委托。为要加载的每个图像创建此类的对象并将其添加到 NSOperationQueue 并将 NSOperationQueue 的最大并发操作计数设置为 1。

于 2013-02-18T06:33:10.727 回答