我PhotoGrid
每行有一张三张照片,使用UITableView
.
我有一个内存缓存(使用 NSCache),它可以容纳 100 张图像,所以即使我在磁盘上有数千张图像要显示在网格中,我也会有一次在内存中最多有 100 张图像。
我所有的图像都是 4KB-20KB JPEG。
因此,使用此基础架构,当用户滚动照片网格时,图像会不断地从 NSCache 加载和卸载。正常滚动一切看起来都不错,我得到大约 55-58 fps。
当用户开始更快地来回滚动时,我有两种情况:
如果我将图像加载任务从主线程中分离出来,我最终会在照片网格上丢失图像,因为我的单元格在图像被读入内存之前显示。
(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ UIImage *image = getImageFromCacheForImagePath:imagePath; dispatch_async(dispatch_get_main_queue(), ^{ cell.leftGridItem.imageView.image = image; }); }); }
如果我在主线程上有图像加载任务,则会出现口吃。我得到大约36-45fps。
(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UIImage *image = getImageFromCacheForImagePath:imagePath; cell.leftGridItem.imageView.image = image; }
getImageFromCacheForImagePath:imagePath
如果存在,则立即从 NSCache 获取图像,如果不存在,则从文件中加载图像并设置到 NSCache 以供以后使用,但我将限制设置NSCache
为 100。
我尝试/调整的事情:
- 避免
clipsToBounds
用于网格图像视图。 - 在后台线程上加载图像。
NSOperation
队列的使用。- 以 100 个批量加载图像(有效,但快速滚动,图像加载时间被延迟)。
我试图达到与原生照片应用程序相同的感觉。
感谢您的建议。