我有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
队列。我正在努力实现与原生照片应用相同的感觉。
您的建议表示赞赏。
答案 0 :(得分:0)
我已经实现了一个包含700多张图像的平滑滚动表。关键不仅是在背景中加载图像,还要在背景中调整大小以完全适合容器。显然调整大小是在UI线程中执行它太重的操作。