2013-01-07 29 views
6

我有一个,每行有三张照片,使用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个批次加载图像(有效,但快速滚动,图像加载时间延迟)。

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

您的建议非常感谢。

+1

请检查您的问题中的代码。格式化需要帮助,并在完成后发现一些问题(请参阅代码'^ {',它看起来应该开始一个新的代码块,但对我来说似乎不正确)。我们试图帮助您将其格式化,但这并不明确。 – ErikE

+0

我不知道他们是不是像导入时间一样离线生成缩略图,然后缩略图的小尺寸为主线程加载提供了显着的优势。 –

回答

0

我几天前还面临同样的问题,因此GitHub是搜索开源解决方案的最佳地点,因此请尝试这些链接。

检查PF-GridViewDTGridView

也拿上AQGridViewHow to Write a Custom Image Picker like UIImagePicker一看,

只需要根据我们的需要做到位manupulation和它的作品就像一个冠军。

+0

感谢您的建议,所面临的问题更多的是巧妙和及时地将图像从光盘加载到内存,这样我就不会占用太多内存,但仍然可以在平滑滚动的网格视图中显示图像。就像原生照片应用程序一样,即使有数千张照片,它们也可以平滑滚动,就好像所有图像都在内存中一样。我想弄明白,他们是如何处理它的。 –

0

我已经实现了超过700张图像的平滑滚动表。关键不仅是在后台加载图像,而且在后台调整大小以完全适合容器。在UI线程中进行调整大小操作太重。