【发布时间】:2012-12-20 21:42:42
【问题描述】:
我有一个PhotoGrid,每行有三张照片,使用UITableView 实现。
我有一个内存缓存(使用 NSCache),它可以容纳 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 张图片(有效,但滚动速度很快,图片加载时间有所延迟)。
我正在努力实现与原生照片应用相同的感觉。
感谢您的建议。
【问题讨论】:
-
请查看您问题中的代码。格式化需要帮助,完成后会发现一些问题(参见代码
^{,它看起来应该开始一个新的代码块,但对我来说似乎不正确)。我们试图帮助您正确格式化,但还不是很清楚。 -
我想知道他们是否没有像在导入时那样离线生成缩略图,然后缩略图的小尺寸为他们提供了主线程加载的显着优势。
标签: ios ios5 ios6 smooth-scrolling nscache