从Internet上的图像加载到您的应用程序不是很明显的问题。

DispatchQueue.main和NSCache也是您的朋友。

当您的应用程序从API加载图像并将该图像加载到数据中并在tableView中显示这些图像时,您可能会遇到图像无法正确加载以及某些图像在错误的tableview中出现的问题。 在这篇博客文章中,我将尝试确定在使用从Internet加载的图像的自定义单元格中出现的主要问题,并尝试为您提供一个简单的本机(也是原始的)解决方案。

将您的gif滚动得非常快,并在此处他妈的tableviews。

您的图像闪烁并被分配到错误的单元格。

当您使用本机swift方式将图像加载到tableview时,它会触发您的应用用来下载图像的新数据线程,(如果您不熟悉线程的概念,这是对并发和多线程的很好的介绍作者:Bob The Dev)加载图像后,需要将图像分配给相应的UIImageViews对吗? 因此,您只需在数据下载完成后立即进行操作即可! 嗯……不完全正确,因为结构(或CocoaTouch)的速度如何,如果您在除主线程之外的其他线程中执行UI操作,它将大吼大叫。 那么如何避免编译器的愤怒呢?

您将代码重新返回到主线程上。

使用dispatchQueue,您可以返回到主线程并在那里执行UI操作。 因此要记住一个好的经验法则,所有UI操作都必须进入主线程

经验法则:所有UI操作都必须在主要方面完成。

如果这样做,编译器应停止对您大喊大叫。 但是问题不止于此。

您正在耗尽他们的数据,现在该变得聪明了。

根据代码的结构方式,您可能会在每次出现单元格时发出Web请求来获取图像,问题是,当单元格消失时,很有可能您的图像也消失了,然后当该图像需要再次显示时,电话将再次发出Web请求以获取图像,并使用用户的电池和数据。 解决此问题的方法是使用图像缓存。

NSCache在数据存储区内部。

对不起。

NSCache是​​一项功能,使您可以收集各种数据对象,可以在完成加载后将其保留在图像上,并且不再显示后,只需为其分配一个密钥即可存储它,您以后可以使用键进行检索。 因此,每次单元格显示图像时,您都可以进行代码检查,以检查图像是否已在缓存中,如果已存在,请使用缓存中的图像。

一种简单的方法是将用于获取对象的urlString分配为图像的键,这样就不必在每次下载新图像时都考虑键名称。 为了得到它,我们只需要urlString和voila的值。

结论

  1. 与UI修改有关的任何操作都需要在主线程中完成,这可以通过使用dispatchQueue.main代码块来完成。
  2. 将您下载的图像缓存在NSCache对象中,并分配urlString作为获取该对象的唯一键是一个很好的经验法则。 最后,只需添加一个代码检查,检查您是否已经具有以urlString作为键的图像,如果是,请使用该键将getObject转换为UIImage,然后使用它! 没有浪费的请求,更快的应用程序!