SDWebImage Source Probe: Downloader

472 查看

 为了进行图片下载操作,通过 SDWebImageManager 这座桥梁,有效控制了图片下载的时机和同缓存的协同操作。这篇来关注一下在 SD 中,Downloader Class 的具体实现。

Downloader 中的一些枚举

SDWebImageDownloader.m 中,可以发现这么一个属性:

NSOperation 表示一个独立的控制单元,也就是我们所说的线程。而 NSOperationQueue 控制着这些并行操作的执行,以队列的数据结构特点,从而实现线程优先级的控制。而在 SDWebImage 中,很显然是用来管理 SDWebImageDownloaderOperation 。对于 SDWebImageDownloaderOperation 后面将会单独放在一篇博文中介绍。

同 Manager 一样,我们先来看看在 .h 文件中所有的下载模式枚举。

另外,对于下载顺序,SD 也为我们提供了两种不同的下载顺序枚举:

options 枚举已经几乎将所有的开发场景所需要的模式考虑进来。下面我们来看一看具体的实现代码。

Downloader 的私有成员对象

先来看下 Class 的 property 对象的作用:

由于需要保证多个图片可以同时下载,为了保证 URLCallbacks 的线程安全,我们使用 GCD 中的 dispatch_barrier_sync 为进程设置栅栏(barrier),它会等待所有位于栅栏函数之前的操作执行完成后再执行,并且在栅栏函数执行完成后,其后续操作才会开始执行,这个函数需要同 dispatch_queue_create 生成的 Dispatch 的同步队列(Concurrent Dispatch Queue)共同使用。

有了这些对于类成员的认识,开始阅读 Downloader 的源码: