1、先调用
setImageWithURL: placeholderImage: options:
方法,显示 placeholderImage。
2、SDWebImageManager 根据 URL 开始处理图片。SDWebImageManager 调用
downloadWithURL: delegate: options: userInfo:
方法时,SDImageCache 会调用
queryDiskCacheForKey: delegate: userInfo:
方法,从内存缓存的图片中查找图片。
2.1、如果内存缓存中有图片:SDImageCacheDelegate 回调
imageCache: didFindImage: forKey: userInfo:
方法到 SDWebImageManager,SDWebImageManagerDelegate 回调
webImageManager:didFinishWithImage:
方法到 UIImageView+WebCache 前端显示图片。
2.2、如果内存缓存中没有图片,添加 NSInvocationOperation 到队列中, NSOperation 根据 URLKey 从硬盘缓存目录中查找图片,即,回主线程回调
notifyDelegate:
方法。
2.2.1、如果硬盘缓存中有图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调
imageCache:didFindImage:forKey:userInfo:
方法显示图片。
2.2.2、如果硬盘缓存中没有图片,即,所有缓存都没有图片,则需要下载图片。
2.2.2.1、回调
imageCache: didNotFindImageForKey: userInfo:
共享或创建一个下载器 SDWebImageDownloader 开始下载图片。
2.2.2.2、NSURLConnection 实现相关代理方法,判断图片下载中、下载完成和下载失败。在
connection: didReceiveData:
方法中利用 ImageIO 做了按图片下载进度加载效果。
2.2.2.3、数据下载完成后交给 SDWebImageDecoder 做图片解码处理。图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程刷新 UI。
connectionDidFinishLoading:
如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。在主线程
notifyDelegateOnMainThreadWithInfo:
的方法中,宣告解码完成,
imageDecoder:didFinishDecodingImage:userInfo:
方法回调给 SDWebImageDownloader,
imageDownloader:didFinishWithImage:
方法回调给 SDWebImageManager 告知图片下载完成。
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 可以预先下载图片,方便后续使用。
附:
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(@"下载完成");
}];
如有不当、错误之处,欢迎指正!