SDWebImage1——基本使用
一、说明
以下关于源码的注释来自于
文顶顶 的注释。
图片的显示有多个方法,下面我们主要来看看以下的三个方法。
1.1 UIImageView+WebCache 中最复杂的方法
/*
* 根据图片的url下载图片并设置到ImageView上面去,占位图片
* 异步下载并缓存
*
* @param url 图片的URL
* @param placeholder 显示在UIImageView上面的占位图片,直到图片下载完成
* @param options 下载图片的选项。参考SDWebImageOptions的枚举值
* @param progressBlock 下载的进度回调
* @param completedBlock 当操作执行完毕之后的回调。该回调没有返回值
* 第一个参数为请求的图片
* 第二个参数是NSError类型的,如果图片下载成功则error为nil,否则error有值
* 第三个参数是图片缓存的使用情况(内存缓存|沙盒缓存|直接下载)
* 第四个参数是图片的URL地址
*/
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;
1.2 SDWebImageManager 中的方法
* 如果URL对应的图像在缓存中不存在,那么就下载指定的图片 ,否则返回缓存的图像
*
* @param url 图片的URL地址
* @param options 指定此次请求策略的选项
* @param progressBlock 图片下载进度的回调
* @param completedBlock 操作完成后的回调
* 此参数是必须的,此block没有返回值
* Image:请求的 UIImage,如果出现错误,image参数是nil
* error:如果出现错误,则error有值
* cacheType:`SDImageCacheType` 枚举,标示该图像的加载方式
* SDImageCacheTypeNone:从网络下载
* SDImageCacheTypeDisk:从本地缓存加载
* SDImageCacheTypeMemory:从内存缓存加载
* finished:如果图像下载完成则为YES,如果使用 SDWebImageProgressiveDownload 选项,同时只获取到部分图片时,返回 NO
* imageURL:图片的URL地址
*
* @return SDWebImageOperation对象,应该是SDWebimageDownloaderOperation实例
*/
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
options:(SDWebImageOptions)options
progress:(SDWebImageDownloaderProgressBlock)progressBloc
completed:(SDWebImageCompletionWithFinishedBlock)completedBlock;
1.3 SDWebImageDownloader中的方法
/*
* 使用给定的 URL 创建 SDWebImageDownloader 异步下载器实例
* 图像下载完成或者出现错误时会通知代理
* url:要下载的图像 URL
* SDWebImageDownloaderOptions:下载选项|策略
* progressBlock:图像下载过程中被重复调用的 block,用来报告下载进度
* completedBlock:图像下载完成后被调用一次的 block
* image:如果下载成功,image 参数会被设置
* error:如果出现错误,error 参数会被设置
* finished:
如果没有使用 SDWebImageDownloaderProgressiveDownload,最后一个参数一直是 YES
* 如果使用了 SDWebImageDownloaderProgressiveDownload 选项,此 block 会被重复调用
* 1)下载完成前,image 参数是部分图像,finished 参数是 NO
* 2)最后一次被调用时,image 参数是完整图像,而 finished 参数是 YES
* 3)如果出现错误,那么finished 参数也是 YES
* 返回值:可被取消的 SDWebImageOperation
*/
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
options:(SDWebImageDownloaderOptions)options
progress:(SDWebImageDownloaderProgressBlock)progressBlock
completed:(SDWebImageDownloaderCompletedBlock)completedBlock;
二、UIImageView+WebCache 中最复杂的方法 示例
2.1 示例代码
/*内存+磁盘缓存*/
-(void)download{
NSString *path = @"http://www.qqpk.cn/Article/UploadFiles/201112/20111208140318990.jpg";
//内部也是调用了 download2的方法
/*
第一个参数:下载图片的url地址
第二个参数:占位图片
第三个参数:progress 进度回调
receivedSize:已经下载的数据大小
expectedSize:要下载图片的总大小
第四个参数:
image:要下载的图片
error:错误信息
cacheType:缓存类型
imageURL:图片url
*/
[self.imageView sd_setImageWithURL:[NSURL URLWithString:path] placeholderImage:[UIImage imageNamed:@"image1"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
switch (cacheType) {
case SDImageCacheTypeNone:
NSLog(@"不使用缓存,直接下载");
break;
case SDImageCacheTypeDisk:
NSLog(@"使用磁盘缓存");
break;
case SDImageCacheTypeMemory:
NSLog(@"使用内存缓存");
break;
}
}];
}
2.2 SDWebImageOptions枚举说明
//使用位移枚举,通过按位与&按位或|的组合方式传递多个值
typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
/**
* 默认情况下,如果一个url在下载的时候失败了,那么这个url会被加入黑名单,不会尝试再次下载。如果使用该参数,则该URL不会被添加到黑名单中。意味着会对下载失败的URL尝试重新下载。
* 此标记取消黑名单
*/
SDWebImageRetryFailed = 1 << 0, //失败后尝试重新下载
/**
* 默认情况下,在 UI 交互时也会启动图像下载,此标记取消这一特性
* 会推迟到滚动视图停止滚动之后再继续下载
* 备注:NSURLConnection 的网络下载事件监听的运行循环模式是 NSDefaultRunLoopMode
*/
SDWebImageLowPriority = 1 << 1, //低优先级
/**
* 使用该参数,将禁止磁盘缓存,只做内存缓存
*/
SDWebImageCacheMemoryOnly = 1 << 2, //只使用内存缓存
/**
* 此标记允许渐进式下载,就像浏览器中那样,下载过程中,图像会逐步显示出来
* 默认情况下,图像会在下载完成后一次性显示
*/
SDWebImageProgressiveDownload = 1 << 3, //渐进式下载
/**
* 遵守 HTPP 响应的缓存控制,如果需要,从远程刷新图像
* 磁盘缓存将由 NSURLCache 处理,而不是 SDWebImage,这会对性能有轻微的影响
* 此选项用于处理URL指向图片发生变化的情况
* 如果缓存的图像被刷新,会调用一次 completion block,并传递最终的图像
*/
SDWebImageRefreshCached = 1 << 4, //刷新缓存
/**
* 如果系统版本是iOS 4+的,那么当App进入后台后仍然会继续下载图像。
* 这是向系统请求额外的后台时间以保证下载请求完成的
* 如果后台任务过期,请求将会被取消
*/
SDWebImageContinueInBackground = 1 << 5, //后台下载
/**
* 通过设置,处理保存在 NSHTTPCookieStore 中的 cookies
*/
SDWebImageHandleCookies = 1 << 6, //处理保存在NSHTTPCookieStore中的cookies
/**
* 允许不信任的 SSL 证书
* 可以出于测试目的使用,在正式产品中慎用
*/
SDWebImageAllowInvalidSSLCertificates = 1 << 7, //允许不信任的 SSL 证书
/**
* 默认情况下,图像会按照添加到队列中的顺序被加载,此标记会将它们移动到队列前端被立即加载
* 而不是等待当前队列被加载,因为等待队列加载会需要一段时间
*/
SDWebImageHighPriority = 1 << 8, //高优先级(优先下载)
/**
* 默认情况下,在加载图像时,占位图像已经会被加载。
* 此标记会延迟加载占位图像,直到图像已经完成加载
*/
SDWebImageDelayPlaceholder = 1 << 9, //延迟占位图片
/**
* 通常不会在可动画的图像上调用transformDownloadedImage代理方法,因为大多数转换代码会破坏动画文件
* 使用此标记尝试转换
*/
SDWebImageTransformAnimatedImage = 1 << 10, //转换动画图像
/**
* 下载完成后手动设置图片,默认是下载完成后自动放到ImageView上
*/
SDWebImageAvoidAutoSetImage = 1 << 11 //手动设置图像
};
2.3 图示
三、SDWebImageManager 中的方法 示例
3.1 说明
其实上面我们示例中使用的图片的方法,调用的就是我们接下来用的这个方法。
我们可以看到 UIImageView + WebCache 中有如下代码
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock {
..........
// 实例化 SDWebImageOperation 操作
id <SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
//移除UIActivityIndicatorView
[wself removeActivityIndicator];
if (!wself) return;
//下面block中的操作在主线程中处理
dispatch_main_sync_safe(^{
if (!wself) return;
//如果图片下载完成,且传入的下载选项为手动设置图片则直接执行completedBlock回调,并返回
if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock)
{
completedBlock(image, error, cacheType, url);
return;
}
else if (image) { //否则,如果图片存在,则设置图片到UIImageView上面,并刷新重绘视图
wself.image = image;
[wself setNeedsLayout];
} else {
//如果没有得到图像
//如果传入的下载选项为延迟显示占位图片,则设置占位图片到UIImageView上面,并刷新重绘视图
if ((options & SDWebImageDelayPlaceholder)) {
wself.image = placeholder;
[wself setNeedsLayout];
}
}
if (completedBlock && finished) {
completedBlock(image, error, cacheType, url);
}
});
}];
........
}
3.2 示例代码
/*内存+磁盘缓存*/
-(void)download2{
NSString *path = @"http://www.qqpk.cn/Article/UploadFiles/201112/20111208140318387.jpg";
[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:path] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
NSLog(@"%f",1.0*receivedSize/expectedSize);
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
switch (cacheType) {
case SDImageCacheTypeNone:
NSLog(@"不使用缓存,直接下载");
break;
case SDImageCacheTypeDisk:
NSLog(@"使用磁盘缓存");
break;
case SDImageCacheTypeMemory:
NSLog(@"使用内存缓存");
break;
}
self.imageView.image = image;
}];
}
3.3 图示
四、SDWebImageDownloader中的方法 示例
4.1 说明
我们接下来使用的这个方法,它的 completed 代码块是在子线程中运行的,如果我们要刷新UI需要提交操作到主线程中。
4.2 示例代码
/*不要任何缓存的处理*/
-(void)download3{
NSString *path = @"http://www.qqpk.cn/Article/UploadFiles/201112/20111208140318960.jpg";
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:path] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
} completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
//它处于子线程中
NSLog(@"%@",[NSThread currentThread]);
[[NSOperationQueue mainQueue] addOperation:[NSBlockOperation blockOperationWithBlock:^{
self.imageView.image = image;
}]];
}];
}