使用SDWebImage可以去加载远程图片,而且还会缓存图片,下次请求会看一下是否已经存在于缓存中,如果是的话直接取本地缓存,如果不是的话则重新请求。它的大概架构:最外层是一个SDWebImageManager单例工具类管理另外两个单例类,一个是作下载处理的SDWebImageDownloader,它管理多个下载操作SDWebImageDownloaderOperation,一个作缓当我们需要下载图片时,先让SDImageCache从缓存中找,如果找不到就异步从硬盘中读取图片,如果读取到就将图片缓存到内存并回调给SDWebImageManager,如果找不到就让SDWebImageDownloader 执行下载操作,在 SDWebImageDownloaderOperation 单个图片的下载操作中利用 NSURLConnection 执行下载,实现代理监听下载进度等,下载完成后交给SDWebImageDecoder 图片异步解码,完成后回调给SDWebImageDownloader,再回调给SDWebImageManager,再让SDImageCache去执行内存和磁盘(异步)的缓存操作处理的SDImageCache,
1、下载图片的线程执行完后回调
- (void)sd_setImageWithURL:(NSURL *)url completed: (SDWebImageCompletionBlock)completedBlock;
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock;
2、下载图片并获取图片下载进度 progressBlock
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;
3、先从本地缓存中查找请求的图片,如果有先用本地图片占位,再从服务器请求下载图片
- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;
4、下载一组动画图片,并自动播放动画(arrayOfURLs为一组图片的地址数组)
- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs;
5、取消当前下载
- (void)sd_cancelCurrentImageLoad;
6、取消下载一组动画图片
- (void)sd_cancelCurrentAnimationImagesLoad;
7、设置是否显示活的指示器以及样式
注意:必须在请求下载图片之前给UIImageView设置!不然无法显示!
- (void)setShowActivityIndicatorView:(BOOL)show;
- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style;
SDWebImage中options 枚举介绍:
SDWebImageRetryFailed 失败后重试, 默认如果下载失败,这个url会被加入黑名单并且不会尝试再次下载,设置这个枚举会阻止把失败的url加入黑名单,不断尝试重新下载
SDWebImageLowPriority 延迟下载, 默认情况下,图片会在交互发生的时候下载(例如你滑动tableview的时候),这个枚举会禁止这个特性,导致的结果就是在scrollview减速的时候才会开始下载(也就是你滑动的时候scrollview不下载,你手从屏幕上移走,scrollview开始减速的时候才会开始下载图片)
SDWebImageCacheMemoryOnly 只在内存缓存
SDWebImageProgressiveDownload 渐进式下载,显示的图像是逐步在下载
SDWebImageRefreshCached 刷新缓存,有时本地图片更新后与服务器没有同步一致时可以使用(例如更新头像),专门处理相同url,但不同image的情况的
原因:默认情况下,SDWebImage会忽略Header中的缓存设置,将图片以url为key进行保存,url与图片是一一对应关系。所以请求同一个url时,SDWebImage会从缓存中取得图片。一般的情况下用此方法可以满足我们的应用要求,但是如果你请求同一个url,而这张图片在服务器端更新了,本地客户端再次请求时还是会返回缓存中的旧图片,例如加载头像类经常更新的图片时,就会出现头像不能更新的问题,由于url与图片一一对应,一种解决的办法是改变部分url地址方式实现更新,不过这种方法操作起来很复杂, 另一种将第三个参数设置为SDWebImageRefreshCached就可以实现图片更新操作了。
SDWebImageContinueInBackground 启动后台下载,app进入后台后继续下载
SDWebImageHandleCookies 处理存储在NSHTTPCookieStore中的cookie
NSMutableURLRequest.HTTPShouldHandleCookies = YES;
SDWebImageAllowInvalidSSLCertificates 允许使用无效的SSL证书,主要用于测试目的,在正式环境中慎用
SDWebImageHighPriority 优先下载
SDWebImageDelayPlaceholder 等待下载完成后再显示占位图片,延迟显示占位图片
SDWebImageTransformAnimatedImage 改变动画形象
SDWebImageAvoidAutoSetImage 下载完成后手动设置图片,默认是下载完成后自动放到ImageView上