【发布时间】:2010-11-17 20:48:53
【问题描述】:
我有一个UITableView,它在单元格中显示了很多图像,我对滚动性能并不满意。我的UITableView 类似于 iPhone 上的照片应用程序。有谁知道为什么 iphone foto 应用程序滚动得如此之快,好像屏幕上什么都没有。
有没有人有一些提示/技巧来提高我的性能/滚动速度?
【问题讨论】:
标签: iphone performance image cell tableview
我有一个UITableView,它在单元格中显示了很多图像,我对滚动性能并不满意。我的UITableView 类似于 iPhone 上的照片应用程序。有谁知道为什么 iphone foto 应用程序滚动得如此之快,好像屏幕上什么都没有。
有没有人有一些提示/技巧来提高我的性能/滚动速度?
【问题讨论】:
标签: iphone performance image cell tableview
您应该预先缓存您的图像,而不是偷懒。当您滚动表格时,会调用 UITableViewDataSource:cellForRowAtIndexPath: 方法,如果您在其中加载图像,那么您会看到它在滚动时请求您的单元格内容,从而在您的应用程序中产生延迟。尝试让你的 cellForRowAtIndexPath: 像这样:
NSDate *date = [NSDate date];
... your cell loading code ...
NSLog( @"Elapsed time to generate cell %.2d", [date timeIntervalSinceNow] );
您会看到获取每个单元格所花费的时间。
要解决这个问题,您可以根据需要尽可能复杂 - 如果您有很多 图像,那么您将不得不变得越来越聪明。您可以进行分页加载,在其中跟踪请求的最后一个单元格的 NSIndexPath,并确定滚动是向上还是向下,并使用 +NSImage:imageNamed: 立即获取一些页面价值的图像(即,您前面的 5 个图像)当前位置),或任何适合您的方式(利用人们必须将手指返回到表格底部才能再次滑动的事实,因此表格元素的消耗会暂停 - 您可以调整页面大小大到足以填充滑动)。不过,这可能仍然不是很好,因为您只会同时承受所有的影响,而不是每个单元都承受着紧张的负载。
您可以快速将控制权返回给 UI,并允许系统使用 NSRunLoop:performSelector:target:argument:order:mode: 在主运行循环中使用 NSImage:imageNamed: 安排预取的图像页面,然后在请求单元格时(如果您获取的距离足够远)它将可以显示。
不过,您需要痛苦地意识到内存问题。如果您发现这是一个问题,请使用NSImage:initWithContentsOfFile:,它会在内存不足的情况下清理图像缓存。根据缓存失效算法使用的策略,这些情况可能会在您清除缓存时导致“卡顿”并且必须重新加载失效的预取。
【讨论】:
通过继承 UITableViewCell 并直接绘制每个单元格的内容,报告了出色的滚动性能结果。有关更多详细信息和代码示例的链接,请参阅this question 的已接受答案。
【讨论】:
这里的问题是内存,你一次加载太多高分辨率图片,foto应用程序不使用tableview它使用滚动视图,它一次最多只能加载3张图片,所以内存不是一个问题,如果你试图做一些类似于 foto 应用程序的事情,请使用滚动视图
【讨论】: