我在这里阅读了很多answers,说通过使用AlamofireImage辅助方法(例如af_setImageWithURL())或任何等效的库,您不必担心单元重用的事情(此外,许多已发布的教程实际上就是这样做的)。也就是说,我不必保留对单元格的弱引用,也不必通过在后台下载完成后使用tableView的cellForRowAtIndexPath()方法来更新其imageView来获取该单元格,就像我们通常手动执行请求一样。

首先,这是真的吗?如果是这样,那么它是如何在库中完成的,导致我尝试跟踪AlamofireImage的af_setImageWithURL()代码,而我却找不到任何努力来确保我们仍在处理发出请求的同一单元格上。我想念什么吗?

听起来很傻,很抱歉,但是我真的很困惑。

最佳答案

假设您在谈论UIImageView类别,是的,它确实解决了许多困扰天真的异步图像检索问题的问题,即:

  • 如果在相关单元格的上方或下方插入了一个单元格,则NSIndexPath已更改的事实不会影响该单元格的image的异步更新。
  • 如果您快速滚动到第100行,当您在重用单元格上调用af_setImageWithURL时,对先前与此重用单元格关联的先前行的请求将被取消。
  • 的一个含义是,它避免了用与该重用单元格先前相关联的行的图像的图像请求来更新可见行的 ImageView 。 (这避免了简单的实现可能会遇到的慢速连接上的图像“闪烁”。)
  • 的另一个含义是,它避免了性能问题,在该问题中,与单元100关联的图像可能积压在对行1-99的图像请求之后。
  • AlamofireImage还提供图像大小调整例程,这在显示单元格的缩略图时非常重要。如果不调整图像大小,则在使用大型 Assets 时(尤其是在其中可能显示许多缩略图的集合 View 中),可能会占用过多的内存。

  • 对于AlamofireImage可能无法像我们期望的那样优雅处理的UITableViewCell问题,它包括:
  • 关于缓存,AlamofireImage依赖于底层NSURLCache,而不是通过NSCache或本地持久性存储进行自己的缓存。虽然我理解了作者为什么这样做(有一定的直观吸引力,但NSURLCache应该能够优雅地做到这一点),但您应该意识到NSURLCache可能会出现问题,只能按照文档记录不多的规则进行缓存(如果资源超过5个占总缓存大小的百分比,它不会被缓存;如果HTTP header 不太正确,它将不会被缓存,等等)。因此,在缓存问题上必须格外小心。
  • 关于预热(与可见行相邻的单元格的图像预取),AlamofireImage在这里没有做太多事情。您可能希望对与可见行相邻的单元格进行一些低优先级的请求管理,以使可见单元格的性能不会受到不利影响,而且当用户滚动时,与这些行关联的图像也已经存在。

  • 最重要的是,使用UIImageView类别时说“您不必担心单元重用的东西”是一种夸大的说法。您仍然需要仔细设计单元重用逻辑,例如:
  • 即使所涉及的行可能没有要显示的图像,也要确保您没有任何路径可以绕过 ImageView 的更新。
  • 标识是否需要调整图像大小;
  • 确认NSURLCache在您所处的环境中正确缓存;
  • 决定是否要创建和缓存缩略图;

  • 但是,确实,执行良好的UIImageView类别可以避免过于简单的异步图像检索例程的许多陷阱。但这不是 Elixir 。

    关于ios - 在UITableViewCell内部使用AlamofireImage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34403664/

    10-14 21:48