如何缓存属于自定义UITableViewCell的CollectionViewCell图像

时间:2017-01-16 00:48:57

标签: ios objective-c uitableview uicollectionview

所以,我有这个新闻提要结构。每个新闻块都是自定义UITableViewCell。现在,每个自定义单元格都有一个显示图像的CollectionView

enter image description here

问题在于,当滚动和新闻单元(新闻块)出现时,CollectionView正在重新加载 - 每次单元格出现时。我正试图找到在主ViewController侧缓存这些图像的方法。

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

如果你想避免为这类工作实现你自己的缓存/磁盘/内存处理程序,我强烈推荐AFNetworking或SDWebImage为你处理它。

关于如何设置图像及其缓存的SDWebImage示例:

[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
             placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

它会自动为您处理所有缓存/磁盘/内存。

以下是使用SDWebImage处理缓存的示例:

//设置内存大小限制(检查旧设备以避免在将其设置为高值时出现内存错误。)

[[SDImageCache sharedImageCache] setMaxMemoryCost:****];

//清除磁盘缓存

[[SDImageCache sharedImageCache] clearDiskOnCompletion:^{
}];

//清除内存缓存

[[SDImageCache sharedImageCache] clearMemory];

我会远离NSUserDefaults或上面提到的将图像设置为字典或数组的示例,以避免内存错误和应用程序崩溃/性能。

答案 1 :(得分:0)

你必须缓存你的UIImage实例,所以,如果你从任何来源获得一些图片,你可能会写下面的内容:

/* some code before */
UIImage *yourImage = /* Get your UIImage from any available way */
[self.cache setObject:yourImage forKey:@"SomeUniqueID"];
/* some code after */

我想,这段代码看起来更像是一个函数,它获取UIImage实例并且它的id作为参数。

我认为,这是存储图像的最常用方式。如果您需要更加熟练的方式而没有任何第三方框架的开销,您可以阅读有关NSCache的文档。

但总的来说,您有很多不同的方式来存储图像:

  1. 从磁盘中获取图像
  2. 从记忆中获取图像
  3. 使用上述变体之一,但除了它们之外仍然使用一些轻量级&灵活的框架,你可以在GitHub上找到很多。
  4. 因此,我上面编写的代码只会将图像存储到内存缓存中。