我有一个,每行有三张照片,使用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个批次加载图像(有效,但快速滚动,图像加载时间延迟)。
我试图达到与原生照片应用程序相同的感觉。
您的建议非常感谢。
请检查您的问题中的代码。格式化需要帮助,并在完成后发现一些问题(请参阅代码'^ {',它看起来应该开始一个新的代码块,但对我来说似乎不正确)。我们试图帮助您将其格式化,但这并不明确。 – ErikE
我不知道他们是不是像导入时间一样离线生成缩略图,然后缩略图的小尺寸为主线程加载提供了显着的优势。 –