【问题标题】:How to handle memory when many images has to be downloaded?当必须下载许多图像时如何处理内存?
【发布时间】:2013-11-11 09:51:43
【问题描述】:

我创建了一个应用程序,用户可以在其中上传图像,并且他们还可以查看其他用户上传的所有图像。我已经集成了分页代码并一次下载 10 张图像并将它们显示在 UITableView 上。我已将 AFNetworking 用于将图像保存在缓存中的任务。问题是当用户继续下载图像并且计数达到大约 300 张图像时,应用程序会因为设备内存不足而崩溃。我正在寻找这个问题的最佳解决方案。我的想法是一次在缓存中保留 50 张图像,当用户下载新图像时,旧图像将从缓存中删除。也请让我知道我是否可以使用 AFNetworking 做到这一点。

【问题讨论】:

  • 您是否将图像存储在文档目录中?将您的代码发布在泄漏的位置..
  • @Ganapathy 不,AFNetworking 将图像存储在它的缓存中,我不知道这个缓存在哪里。这是内存分配问题,而不是泄漏问题。
  • 每次开始下载图像后,请清除缓存。例如,如果您要下载 2nd 50 图像,只需清除缓存并开始下载。像这样尝试一次。
  • @Ganapathy 你能告诉我如何清除缓存吗?
  • 您可以改用 SDWebImage,它适用于 300 多张图片。

标签: uitableview memory-management afnetworking


【解决方案1】:

您应该使用 SDWebImage 而不是下载它将缓存的图像,您也可以自定义该缓存选项。

我正在使用这个 SDWebImage 在 UICollectionview 和 UITableview 中缓存 150 +图像,并且它的工作完美。

最初我们需要添加一个占位符,然后它会一一出现。

实现

1.取出SDWebImage代码 SDWebImage

2.将头文件导入到您的视图控制器中

#import <SDWebImage/UIImageView+WebCache.h>

3. 然后在 cellforrowindex() 方法中添加一行代码。我会给你示例代码快照

 // Here we use the new provided setImageWithURL: method to load the web image
    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

【讨论】:

    【解决方案2】:

    试试APSmartStorage。您可以管理存储在内存中的图像数量。如果出现“内存警告”,图像将从内存中删除。但无论如何都可以,因为所有图像都存储在文件中,因此您无需从网络重新加载它们。

    【讨论】:

      【解决方案3】:

      正如 cmets 中提到的@Aklesh Rathaur,您可以尝试SDWebImage,Facebook 也在他们的移动应用上使用它。

      当需要更多内存时,它在缓存和释放内存方面做得很好。引用How is SDWebImage better than X?

      另一方面,SDWebImage 将 UIImage 表示缓存在内存中,并将原始压缩(但已解码)图像文件存储在磁盘上。 UIImage 使用 NSCache 按原样存储在内存中,因此不涉及复制,并且在您的应用或系统需要时立即释放内存。

      让我们知道你的结果:-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-12
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多