SDWebImage是一个第三方图片异步加载库。在需要从网络上加载大量图片的时候使用这个库会十分方便。
流程
-sd_setImageWithURL:placeholderImage:options:progress:completed:
UIImageView + WebCache
使用这个库,一般是调用这个方法,指定了处理的选项,占位图片,处理的block和完成操作时的回调block。
1 | objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); |
调用了运行时的方法,在运行时为UIImageView增加了一个属性.
调用了 sd_setImageWithURL:placeholderImage:options:progress:completed:
这个方法之后,会调用 SDWebImageManager
的 -downloadImageWithURL:options:progress:complete:
方法.
SDWebImageManager
拥有连个属性,imageCache
和imageDownloader
.顾名思义,imageCache
负责的是图片的缓存工作,imageDownloader
负责的是图片的下载工作.
在-downloadImageWithURL:options:progress:complete:
这个方法里,先创建一个SDWebImageCombineOperation
,然后使用调用imageCache
的-queryDiskCacheForKey:done:
方法的返回值赋值给operation的cacheOperation
属性.
在-queryDiskCacheForKey:done:
的done
闭包里,判断是否从硬盘中取得了图片,如果取得了图片,则调用sd_setImageWithURL:placeholderImage:options:progress:completed:
中的complete闭包,否则,调用imageDownloader
的-downloadImageWithURL:options:progress:completed:
方法,下载图片.如果下载图片失败,把url加入failedURLs
里.如果下载图片成功,把图片加进NSCache
,如果选项SDWebImageCacheMemoryOnly
为假,那么把图片保存到磁盘中.