6

PhotoGrid每行有一张三张照片,使用UITableView.

我有一个内存缓存(使用 NSCache),它可以容纳 100 张图像,所以即使我在磁盘上有数千张图像要显示在网格中,我也会有一次在内存中最多有 100 张图像。

我所有的图像都是 4KB-20KB JPEG。

因此,使用此基础架构,当用户滚动照片网格时,图像会不断地从 NSCache 加载和卸载。正常滚动一切看起来都不错,我得到大约 55-58 fps。

当用户开始更快地来回滚动时,我有两种情况:

  1. 如果我将图像加载任务从主线程中分离出来,我最终会在照片网格上丢失图像,因为我的单元格在图像被读入内存之前显示。

    (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;
            });
        });
    }
    
  2. 如果我在主线程上有图像加载任务,则会出现口吃。我得到大约36-45fps。

    (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UIImage *image = getImageFromCacheForImagePath:imagePath;
        cell.leftGridItem.imageView.image = image;
    }
    

getImageFromCacheForImagePath:imagePath如果存在,则立即从 NSCache 获取图像,如果不存在,则从文件中加载图像并设置到 NSCache 以供以后使用,但我将限制设置NSCache为 100。

我尝试/调整的事情:

  1. 避免clipsToBounds用于网格图像视图。
  2. 在后台线程上加载图像。
  3. NSOperation队列的使用。
  4. 以 100 个批量加载图像(有效,但快速滚动,图像加载时间被延迟)。

我试图达到与原生照片应用程序相同的感觉。

感谢您的建议。

4

2 回答 2

0

几天前我也遇到了同样的问题,所以 GitHub 是搜索开源解决方案的最佳位置,所以试试这些链接。

检查PF-GridViewDTGridView

也看看AQGridView如何编写像 UIImagePicker 这样的自定义图像选择器

只需要根据我们的需要进行位操作,它就像一个冠军。

于 2013-01-07T07:33:53.380 回答
0

我已经实现了一个包含 700 多个图像的平滑滚动表。关键是不仅要在后台加载图像,还要在后台调整它的大小以完全适合容器。显然调整大小的操作太繁重,无法在 UI 线程中进行。

于 2013-07-12T20:50:41.133 回答