【发布时间】:2010-08-10 18:42:49
【问题描述】:
我已经使用@atebits 的ABTableViewCell 有一段时间了。对于不熟悉的人来说,基本上它通过绘制所有标签和图像,而不是分配 UIKit 对象(如 UILabels、UIImageView 等),使 tableview 滚动快得多。
现在,我有相当大的UITableViews,在每个单元格中,都有一个小的 (32x32) 用户图像和一个中等 (75x75) 的照片缩略图。该绘图确实有助于使此 tableview 快速滚动,但我仍在尝试找出获取这些要在单元格内绘制的图像的最佳方法。
我查看了 Apple 的 LazyTableView 示例,但我仍然不确定执行此操作的最佳方法是什么。我只知道cellForRowAtIndexPath: 中的代码/分配越少越好。
所以我的图像要么从服务器下载,要么从我的 CoreDataHelper 中检索。我的问题是:以下哪种方法更好地检索缓存的图像?
在
cellForRowAtIndexPath:中使用NSFetchRequest来获取缓存的图像(因此在tableview 滚动时分配NSFetchRequest 实例)。将所有缓存的图像从一开始就保留在 tableView 的数据源中,这样我就可以从我的
UITableViewController中的(viewDidLoad:中已分配的数组)数据源中获取它们。这种方法显然会占用更多内存,因为它分配了一堆小图像,但我猜滚动最终会更流畅。
任何人都可以启发我吗?
(顺便说一句,我希望图像显示在 tableview 滚动时。等待它停止滚动以加载图像不是一种选择)。
编辑:从磁盘加载图像
按照提供的答案,我现在尝试使用图像本地路径直接从磁盘加载图像(显然是在保存之后),该路径是 tableview 数据源的一部分。这是cellForRowAtIndexPath: 方法中的代码:
NSData *imageData = [NSData dataWithContentsOfFile:imageLocalPath];
UIImage *userImage = [UIImage imageWithData:imageData];
cell.avatarImage = userImage;
它仍然不是很顺利(每次出现新单元格时都会有一个小滞后(每次调用 cellForRowAtIndexPath:)我应该异步进行此调用吗?或者磁盘读取速度是否足够快并且绝对不是这里的问题?
编辑:更多细节
1.你从哪里得到 imageLocalPath?
图像 url 是我的 dataSource 的一部分,它是在 viewDidLoad 中分配的 NSArray(缓存到 CoreData 但不应该影响滚动)。 app 文档目录路径也保留在 viewDidLoad 中,因此整个文件路径在 cellForRowAtIndexPath 中使用
NSArray *urlArray = [picURLString componentsSeparatedByString: @"/"];
NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsPath, [urlArray lastObject];
2。当你通过鲨鱼运行它时会发生什么?
我以前从未使用过 Shark,尝试使用它,但显然 iOS 4 不再支持它。你能证实这一点吗?当我点击“开始”按钮时,什么也没有发生。
3.您在设备上的 Instruments 中获得的 FPS 是多少?
我的速度在 25 到 30fps 之间,但在实际屏幕上看起来并不那么流畅。不确定这是否意味着什么。我觉得我得到了10-15fps。同样,单元格之间的滚动是平滑的,只是当 tableview 碰到一个新单元格时会有轻微的延迟(滚动速度如此之快 = 每秒有很多这样的小延迟)。
【问题讨论】:
标签: iphone performance uitableview core-data