仪器优化 UIImageView
Posted
技术标签:
【中文标题】仪器优化 UIImageView【英文标题】:Instruments Optimization UIImageView 【发布时间】:2013-02-05 17:31:36 【问题描述】:我正在使用以下代码加载一堆 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。这个 Instruments 分析基本上是说我在代码中无能为力,这是系统库延迟吗?
编辑:我的问题不再是关于我的 collectionView 的这个特定用例。一般是关于仪器的。如果我在屏幕截图中选择了选项,并且应用程序显示明显滞后,但时间分析器没有,我可以在我的代码中做些什么来提高速度吗?我想我更一般地询问时间分析器、设置及其结果。如果所有的延迟都归因于较低级别的代码或系统框架,我能做些什么吗?
【问题讨论】:
你能稍微描述一下你的collectionView吗?我猜它的单元格尺寸很小? 请看我的编辑。谢谢。 【参考方案1】:您在右侧设置面板中启用了Hide System Libraries
复选框,因此它将隐藏对您未定义的方法的任何调用。因此,例如,如果您多次调用imageNamed:
并且选中了此复选框,您将看不到系统解压缩和加载这些图像所花费的时间。
所以从技术上讲,所有“滞后”/缓慢都在系统框架中,但您可以控制更改使用它们的方式。您还可以监控系统框架中的哪些操作在时间上最昂贵。
取消选中此框是解决方案:
【讨论】:
这是我一直在寻找的反馈【参考方案2】:imageNamed:
将缓存您的图像。
使用imageWithContentsOfFile:
避免缓存。
希望这会加快您的加载速度。
【讨论】:
似乎没有帮助:NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[array objectAtIndex:i]]; [finalArray addObject:[UIImage imageWithContentsOfFile:filePath]];【参考方案3】:您是否将它们加载到后台/单独的线程中,如果没有,请这样做将解决您的问题并将它们加载到队列中。所以一旦图像被加载,通知将使用它的对象并将图像对象传递给它。
创建一个简单的 NSOperation 来加载图像并通知分配给它的委托。为您要加载的每个图像创建此类的对象并将其添加到 NSOperationQueue 并将 NSOperationQueue 的最大并发操作数设置为 1。
【讨论】:
以上是关于仪器优化 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章