SDWebImage使用解析

SDWebImage是当下最流行的一个三方图片处理框架,我们使用较多的是它提供的UIImageView分类,支持从远程服务器下载并缓存图片。

SDWebImage框架常用方法:

  • 根据图片的url下载图片并设置到ImageView上面去
/* *
 * 根据图片的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;
    
   //SDWebImageOptions的枚举值:一般使用的是SDWebImageRetryFailed | SDWebImageLowPriority
    typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
       
        SDWebImageRetryFailed = 1 << 0,//下载失败的时候会尝试重新下载(默认)
        SDWebImageLowPriority = 1 << 1,//如果正在UI交互阶段会暂停下载(延迟下载)
        SDWebImageCacheMemoryOnly = 1 << 2, //内存中有缓存,沙河中没有缓存
        SDWebImageProgressiveDownload = 1 << 3, //如果设置的话,图片显示像浏览器显示图片一样(由上往下有进度的显示)
        SDWebImageRefreshCached = 1 << 4, //将硬盘缓存交给系统自带的NSURLCache去处理
        SDWebImageContinueInBackground = 1 << 5, //回到后台的时候还会继续下载
        SDWebImageHandleCookies = 1 << 6, // 通过设置NSMutableURLRequest.HTTPShouldHandleCookies = YES来处理存储在NSHTTPCookieStore中的cookie
        SDWebImageAllowInvalidSSLCertificates = 1 << 7,// 允许不受信任的SSL证书。主要用于测试目的。
        SDWebImageHighPriority = 1 << 8,  //优先下载
        SDWebImageDelayPlaceholder = 1 << 9, //延迟占位符
        SDWebImageTransformAnimatedImage = 1 << 10,
        SDWebImageAvoidAutoSetImage = 1 << 11  //改变动画形象
    };
  • 下载图片调用的主方法(进行磁盘缓存和内存缓存)
/ **
 * @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;

  • 如果我们只需要下载图片,而不需要进行cache处理的时候,我们常常用另外一个类来达成效果:
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock;
  • 播放Gif图片
//传入Gif图像的名称,得到一个可动画的图像
+ (UIImage *)sd_animatedGIFNamed:(NSString *)name;

//传入Gif图像的二进制数据,得到一个可动画的图像
+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;
  • 内存警告处理

-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
    //1.清空缓存
    //clearDisk:直接删除缓存目录下面的文件,然后重新创建空的缓存文件
    //cleanDisk:删除过期的文件数据,计算当前未过期的已经下载的文件数据的大小,如果发现该数据大小大于我们设置的最大缓存数据大小,那么程序内部会按照按文件数据缓存的时间从远到近删除,直到小于最大缓存数据为止。
    //过期时间:7天
    [[SDWebImageManager sharedManager].imageCache clearDisk];
    
    //2.取消当前所有的操作
    [[SDWebImageManager sharedManager] cancelAll];
}

SDWebImage 加载图片的原理

  1. 显示placeholderImage
  2. SDImageCache从缓存中查找图片是否已经下载
  3. 先从内存图片缓存查找是否有图片
  4. 如果内存中有图片缓存,显示图片
  5. 如果内存中没有,生成NSInvocationOperation添加到执行队列开始从硬盘查找图片缓存
  6. 如果硬盘中有,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存),显示图片
  7. 如果硬盘中没有,说明该图片没有缓存,需要下载图片,共享或重新生成一个下载器SDWebImageDownLoader开始下载图片
  8. 开始图片网络请求,下载数据
  9. 数据下载完成后交给SDWebImageDecoder做图片解码
  10. 回调展示图片
  11. 图片保存到硬盘缓存和内存缓存
  12. SDImageCache初始化会注册一些通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片(图片缓存周期是一周)

SDWebImage框架细节

  • SDWebImage内部结构


    Snip20170522_14.png
  • SDWebImage相关知识点补充

  • SDWebImage接收到内存警告的时候如何处理?采用监听系统警告通知的方式处理,接收到警告后清空缓存

  • SDWebImage队列最大并发数为6

  • SDWebImage内部设置下载图片超时时间为15m

  • SDWebImage图片下载操作使用了NSURLConnection类发送网络请求实现

  • 图片的下载顺序,默认是先进先出的

  • SDWebImage内部如何判断图片类型?判断该图片二进制数据的第一个字节

  + (NSString *)sd_contentTypeForImageData:(NSData *)data;
  • SDWebImage做沙盒缓存时图片的命名机制是拿到图片的URL后直接对URL进行MD5加密。终端输入:echo -n "url" |MD5

    Snip20160221_38.png
  • SDWebImage内部使用NSCache类来进行缓存处理

  • NSCache是苹果官方提供的缓存类,专门用来进行缓存处理,具体使用和NSDictionary类似,在AFN和SDWebImage框架中被使用来管理缓存

  • 苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)建议:接收到内存警告时主动调用removeAllObject方法释放对象

  • NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁

  • NSCache的Key只是对对象进行Strong引用,不是拷贝

  • 属性介绍

@property (nullable, assign) id<NSCacheDelegate> delegate; //设置代理
@property (copy) NSString *name; //名称
@property NSUInteger totalCostLimit; //缓存空间的最大总成本,超出上限会自动回收对象。默认值为0,表示没有限制
@property NSUInteger countLimit;//能够缓存的对象的最大数量。默认值为0,表示没有限制
@property BOOL evictsObjectsWithDiscardedContent;//标识缓存是否回收废弃的内容
  • 方法介绍
       - (void)setObject:(ObjectType)obj forKey:(KeyType)key;//在缓存中设置指定键名对应的值,0成本
       - (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//在缓存中设置指定键名对应的值,并且指定该键值对的成本,用于计算记录在缓存中的所有对象的总成本,出现内存警告或者超出缓存总成本上限的时候,缓存会开启一个回收过程,删除部分元素
       - (void)removeObjectForKey:(KeyType)key;//删除缓存中指定键名的对象
       - (void)removeAllObjects;//删除缓存中所有的对象
       - (void)cache:(NSCache *)cache willEvictObject:(id)obj;//代理方法,即将回收对象的时候调用该方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容