如何为iOS应用构建自己的异步图像加载库

我们经常使用第三方从网络中加载UIImageView。 是的,这是一件好事,代码是经过抽象,优化的,更重要的是,我们将精力更多地集中在应用程序逻辑上,而不是处理图像缓存,图像下载错误,在表视图中重用单元格等。

一切都很酷,运转良好。 那为什么我们需要或想要自己构建一些东西。 库是好的,可以构建一个更通用的解决方案,通常可以解决许多其他用例,您甚至可能不需要这些用例,而这些用例并没有实现您想要的用例。

没有库,或者就此而言,没有解决方案完全适合所有用例。 库只是提取代码,但是代码仍然存在。 您是否真的希望那十个代码文件从网络下载图像并显示在应用程序上。 绝对没有

这篇博客文章只是在选择库之前就如何实现和构建自定义实现以适合您的应用程序需求的想法。

如果您有道理并想完全控制图像加载库,则请潜入以免脏手。

让我们从创建网络客户端开始,以从url下载图像。

只是一个简单的类,其中包含一个URLSession,其中URLSessionConfiguration配置为对URL缓存和请求缓存策略进行配置。 很明显。

接下来让我们定义一个协议,以从url下载图像。 downloadUrl函数需要一个URL来下载图像,并带有一个闭包以响应响应。

在响应中,我们传递了url,数据和错误。 现在暂时忽略为什么将URL发送回闭包。 稍后我们将了解其重要性。

一个简单的URLSession数据任务,用于从网络下载图像并将数据传递回闭包。

现在,在代码中的任何地方都有UIImageView,您可以使用下面的代码来设置图像。

但是,这没有什么特别的。 它非常基本。 因此,让我们更进一步,扩展解决方案,该解决方案可以使它变得更加方便,并且也适用于tableview可重用单元格。

让我们定义一个协议来定义我们的解决方案在何处以及如何工作。

因此,在这里和类中具有UIImage和String的实例变量的图像和标识符分别将能够使用我们的解决方案。 现在让我们在此协议的扩展中实施解决方案。

因此,让我们仔细看一下setImageWithUrl函数的作用。

  1. 将图像设置为零
  2. 将url绝对字符串存储为标识符
  3. 使用CacheableImageDownloader从URL下载图像
  4. 在回叫中,第一个警卫检查ARC是否不会破坏ImageDisplayable,还检查下载的响应是否与请求该响应的ImageDisplayable相同。 (以处理tableview单元格图像的用例)
  5. 第二个警卫确保有数据下载。
  6. 最后用数据设置图像

所有这些看起来都不错,但是为什么我们要做所有这些呢。 血腥的UIImageView在哪里。

所有这些都是有原因的,我们正在从UIImageView中提取代码,分离关注点,并使之成为通用行为。 我们将很快将此行为附加到UIImageView

好的,我们如何附加这种行为。 使用扩展程序,可以。

太好了,那就是我们需要做的一切。 UIImageView已经确认了ImageDisplayable的图像属性,并且我们使用UIImageView的accessibilityIdentifier作为标识符来确认到ImageDisplayable

在这之后,您要做的就是