我一直在阅读很多answers这里说通过使用AlamofireImage帮助方法(例如af_setImageWithURL()
)或任何等效的库,你不需要担心细胞重用的东西(加上,许多已发表的教程实际上只是这样做)。也就是说,我不必保留对单元格的弱引用或通过使用tableView的cellForRowAtIndexPath()
方法在后台下载完成后更新其imageView来获取它,就像我们手动请求时通常所做的那样。
首先,这是真的吗?如果是这样,它是如何在库内完成的,因为我试图追踪AlamofireImage的af_setImageWithURL()
代码,我找不到任何努力来确保我们仍在处理我们提出请求的同一个单元格。我错过了什么吗?
我很抱歉,如果这听起来很愚蠢,但我真的很困惑。
答案 0 :(得分:14)
假设您正在讨论UIImageView
类别,是的,它确实解决了许多困扰天真异步图像检索问题的问题,即:
如果在相关单元格的上方或下方插入单元格,NSIndexPath
已更改的事实不会影响相关单元格的image
的异步更新。< / p>
如果您快速滚动到第100行,当您在重复使用的单元格上调用af_setImageWithURL
时,先前与此重用单元格关联的先前行的请求将被取消。
这样做的一个含义是,它避免了可见行的图像视图,该图像视图通过先前与此重用单元格关联的行的图像的图像请求进行更新。 (这避免了简单实现可能遇到的慢速连接上的图像“闪烁”。)
这样做的另一个含义是它避免了与单元格100相关联的图像可能在第1-99行的图像请求后面积压的性能问题。
AlamofireImage还提供了图像大小调整例程,这在显示单元格的缩略图时非常重要。如果不调整图像大小,则在使用大型资源时可能会占用大量内存(特别是在可能会显示许多缩略图的集合视图中)。
就AlamofireImage可能无法正常处理的UITableViewCell
问题而言,它包括:
关于缓存,AlamofireImage依赖于底层NSURLCache
,而不是通过NSCache
或本地持久存储进行自己的缓存。虽然我理解为什么作者这样做(有一些直观的吸引力,只要NSURLCache
能够优雅地执行此操作),您应该知道NSURLCache
可以是有问题的,只根据记录不完整的规则进行缓存(如果资源超过总缓存大小的5%,则不会缓存;如果HTTP标头不正确则不会缓存,等等)。因此,必须小心缓存问题。
关于预热(预取与可见行相邻的单元格的图像),AlamofireImage在这里做的不多。您可能希望看到与可见行相邻的单元格的一些低优先级请求管理,以便不会对可见单元格性能产生负面影响,同时还可以在用户滚动时与这些行关联的图像。
总而言之,在使用UIImageView
类别时,说“你不需要担心细胞重用的东西”是一种夸大其辞。您仍然需要仔细设计您的单元重用逻辑,例如:
NSURLCache
在您的情况下正确缓存; 但确实如此,一个执行良好的UIImageView
类可以预防许多过于简单的异步图像检索例程的陷阱。但这不是银弹。