入口
- (void)sd_setImageWithURL:(nullable NSURL *)url
SDImageView做了非常好的API封装,最终方法做了以下这些事情:
- 以class或者自定义key为关键字,从NSMapTable里找到operation并且取消
- 如果没有指定延迟加载placeholder图片,先设置imageView的image为placeholder
- 加载进度条并监控下载进度,以便刷新进度条的UI
- 开始下载(查找缓存)图片,并且把operation加入NSMapTable里
下载前准备工作
- 初始化SDWebImageCombinedOperation
- 如果url是否在失败队列里,并且没有设置SDWebImageRetryFailed,不下载且执行下载失败block返回给上层,也就是入口层
- 将opration加入runningOperations里,准备下载
- 初始化context执行callCacheProcessForOperation下载方法
- 取缓存图片
- 上一步回调是operation被取消或者不取缓存,开始下载。
开始下载
- URLOperations里以url为key找到SDWebImageDownloaderOperation,如果没找到,或者SDWebImageDownloaderOperation已完成或已取消,创建一个新的SDWebImageDownloaderOperation,重新添加到URLOperations,并加到downloadQueue启动下载,在SDWebImageDownloaderOperation的start方法里,执行NSURLSession
- 如果operation正在等待状态,设置优先级,并且等待执行。
- 下载成功后返回给调用层设置imageView的image
缓存
-
SDMemoryCache缓存
- ① NSCache缓存,随着memoryWarning会进行缓存释放,受系统和最大缓存空间 totalCostLimit,最大缓存数量 countLimit影响
- ② weakCache可以说是备用缓存,如果用户指定使用,除非 SDMemoryCache被释放,否则缓存一直存在,跟memoryWarning无关 SDDiskCache缓存
- 文件操作没什么好说的,需要注意点是存在了 NSCachesDirectory路径下,且默认是在app进入前台或进入后台时都会清除7天以上的数据
- 当拿到memoryCache图片时,并且可以使用缓存图片的话,返回图片
- 不可使用缓存的情况,从SDDiskCache拿到imageData,并转换成image,并存到SDMemoryCache中