SDWebImage(二)

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(@"下载完成");
}];


如有不当、错误之处,欢迎指正!

你可能感兴趣的:(SDWebImage(二))