1、先调用
<pre>
setImageWithURL: placeholderImage: options:
</pre>
方法,显示 placeholderImage。
2、SDWebImageManager 根据 URL 开始处理图片。SDWebImageManager 调用
<pre>
downloadWithURL: delegate: options: userInfo:
</pre>
方法时,SDImageCache 会调用
<pre>
queryDiskCacheForKey: delegate: userInfo:
</pre>
方法,从内存缓存的图片中查找图片。
</br>
</br>
2.1、如果内存缓存中有图片:SDImageCacheDelegate 回调
<pre>
imageCache: didFindImage: forKey: userInfo:
</pre>
方法到 SDWebImageManager,SDWebImageManagerDelegate 回调
<pre>
webImageManager:didFinishWithImage:
</pre>
方法到 UIImageView+WebCache 前端显示图片。
</br>
</br>
2.2、如果内存缓存中没有图片,添加 NSInvocationOperation 到队列中, NSOperation 根据 URLKey 从硬盘缓存目录中查找图片,即,回主线程回调
<pre>
notifyDelegate:
</pre>
方法。
</br>
</br>
2.2.1、如果硬盘缓存中有图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调
<pre>
imageCache:didFindImage:forKey:userInfo:
</pre>
方法显示图片。
</br>
</br>
2.2.2、如果硬盘缓存中没有图片,即,所有缓存都没有图片,则需要下载图片。
2.2.2.1、回调
<pre>
imageCache: didNotFindImageForKey: userInfo:
</pre>
共享或创建一个下载器 SDWebImageDownloader 开始下载图片。
</br>
</br>
2.2.2.2、NSURLConnection 实现相关代理方法,判断图片下载中、下载完成和下载失败。在
<pre>
connection: didReceiveData:
</pre>
方法中利用 ImageIO 做了按图片下载进度加载效果。
</br>
</br>
2.2.2.3、数据下载完成后交给 SDWebImageDecoder 做图片解码处理。图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程刷新 UI。
<pre>
connectionDidFinishLoading:
</pre>
如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。在主线程
<pre>
notifyDelegateOnMainThreadWithInfo:
</pre>
的方法中,宣告解码完成,
<pre>
imageDecoder:didFinishDecodingImage:userInfo:
</pre>
方法回调给 SDWebImageDownloader,
<pre>
imageDownloader:didFinishWithImage:
</pre>
方法回调给 SDWebImageManager 告知图片下载完成。
</br>
</br>
2.2.2.4、通知所有的 downloadDelegates 下载完成,回调给需要的地方显示图片。并将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。
注:
2.2.2.4.1、写文件到硬盘也在单独 NSInvocationOperation 完成,避免拖慢主线程。
2.2.2.4.2、SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
2.2.2.4.3、SDWebImage 也提供了 UIButton+WebCache 和MKAnnotationView+WebCache,方便使用。
2.2.2.4.4、SDWebImagePrefetcher 可以预先下载图片,方便后续使用。
附:
<pre>
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadImageWithURL:imagePath2 options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {
NSLog(@"显示当前进度");
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
NSLog(@"下载完成");
}];
</pre>
如有不当、错误之处,欢迎指正!