具有大量图像的UITableView

时间:2014-04-15 15:34:38

标签: ios objective-c uitableview core-data

我正在尝试制作示例聊天应用。

作为其中的一部分,我想发送图像。我将它们存储在DocumentData文件夹中的CoreData之外。我遇到了tableView缓慢滚动的问题,因为有些图像非常大(对于前用户可以发送全景图像)。

我已将文件读取到后台主题:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

                UIImage *image = [UIImage imageWithContentsOfFile:message.imageAddress];

                dispatch_async(dispatch_get_main_queue(), ^{
                    rightImageCell.messageImageView.image = image;
                    [rightImageCell.messageImageView setNeedsDisplay];
                });

            });

但它没有效果。

以下是滚动期间探查器的屏幕截图: enter image description here

3 个答案:

答案 0 :(得分:1)

FastImageCache可能就是您所需要的。请注意,这不会保留来自Web的图像以便稍后使用,但会创建一个内存图像映射,其中调整大小的图像将显示在屏幕上。

  

快速图像缓存是一种高效,持久且高于一切的快速存储和检索方式   iOS应用程序中的图像。任何好的iOS应用程序的一部分   用户体验快速,平滑滚动,快速图像缓存有帮助   让这更容易。

     

图形丰富的应用程序的性能负担很重   像Path是图像加载。 传统的加载方法   来自磁盘的单个图像速度太慢,尤其是在滚动时。快速图像缓存专门用于解决此问题。

答案 1 :(得分:1)

对于您提供的代码,我怀疑图像大于单元格中的UIImageView。这是触发主线程上的所有调整大小工作,因为这是设置图像的位置。

为了防止这种情况,您应该将图像的大小调整为后台线程中图像视图的大小。然后,当您调度到主线程时,唯一需要的工作就是替换图像视图中的图像。

WWDC 2012视频"在iOS上构建并发用户界面"有很好的例子。 https://developer.apple.com/videos/wwdc/2012/

答案 2 :(得分:0)

我遇到了类似的问题,CollectionViews具有非常高分辨率的图像。

我解决它的方法是将图像预先填充到一个数组中,然后简单地使用数组的索引来获取图像。在将它们放入数组之前,我还将它们缩小到缩略图大小。

由于TableViews重用了单元格,因此当TableView需要重新加载其数据时(例如滚动时),您不希望在任何调用的方法中使用imageWithContentsOfFile:message。 您可能希望使用imageNamed,这会缓存图像并避免在表格单元格在屏幕上滚动时反复重新加载图像。

这是一个很好的资源:http://www.jorambarrez.be/blog/2012/04/19/ios-imagenamed-vs-imagewithcontentsoffile/