缓存图像,使其不会在 reloadData 调用时重新加载 - AFNetworking 2.0 setImageWithUrl

Posted

技术标签:

【中文标题】缓存图像,使其不会在 reloadData 调用时重新加载 - AFNetworking 2.0 setImageWithUrl【英文标题】:Caching image so it does not reload on reloadData call - AFNetworking 2.0 setImageWithUrl 【发布时间】:2015-04-08 16:03:19 【问题描述】:

围绕这个主题有几个关于堆栈溢出的问题,但我找不到解决方案。

我的 tableview 中的每个 tableview 单元格都有一个从 url 加载的 imageview。

图像加载正常,但每当我调用 reloadData 时,图像就会再次加载,从而产生闪烁效果。在 cellForRowAtIndexPath 中,我将 prepareForReuse 中的图像设置为空白图像,因此它也在此处闪烁。

我知道我需要缓存图像,但我该怎么做呢?我是否需要存储自己的缓存图像并在基础数据更改时更新它? AFNetworking 是否默认提供此功能?

我已经尝试过 NSURLRequestReturnCacheDataElseLoad - 它似乎不起作用。

[cell.recipientProfilePic setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[user.photos objectAtIndex:0]] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:2300] placeholderImage:[UIImage imageNamed:@"blank_image_load"] 
  success:nil
  failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) 
];

【问题讨论】:

【参考方案1】:

使用这个工具,你可以用 Cocoapods 安装它:

https://github.com/rs/SDWebImage

它通过带有sd_imageWithURL:享受的URL处理UIImageView的缓存和加载图像。

【讨论】:

感谢 Daniel - 除非必须,否则我宁愿不为此安装另一个库。你知道这是否可以使用 AFNetworking? 嗯,AFNetworking、SDWebImage 和 GPUImage 是大多数开发人员在 ios 中用于处理图像的三个库。如果您真的不想使用其他库,那么您可以将下载的图像存储到磁盘上并将 URL 字典存储到 NSUserDefaults。但这似乎工作量很大,因为 SDWebImage 会为您处理缓存和预取。

以上是关于缓存图像,使其不会在 reloadData 调用时重新加载 - AFNetworking 2.0 setImageWithUrl的主要内容,如果未能解决你的问题,请参考以下文章

循环中的 tableView reloadData 不会在每次通过时绘制单元格

除非调用 reloadData,否则图像无法正确加载

uitableview reloaddata 缓存?

ReloadData 不会触发 tableView:numberOfRowsInSection:

为啥 UITableView contentOffset 在 tableview reloadData 期间变化很大,而不是保持不变? reloadData 后如何使其保持不变?

UIImagePickerController 关闭后 UICollectionView 不会 reloadData()