iOS 图片缓存之SDWebImage

原创 2015年11月17日 22:37:27

一、SDWebImage内部实现过程

入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。
进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.
先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。
如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。
根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。
如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。
共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。
图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。
connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。
connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。
图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。
imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。
通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。
将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。
SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

二、sdwebimage如何获取缓存大小以及清除缓存


1.找到SDImageCache类
2.添加如下方法:

- (float)checkTmpSize {
    float totalSize = 0;
    NSDirectoryEnumerator *fileEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:diskCachePath];
    for (NSString *fileName in fileEnumerator) {
       NSString *filePath = [diskCachePath stringByAppendingPathComponent:fileName];
       NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
       unsigned long long length = [attrs fileSize];
      totalSize += length / 1024.0 / 1024.0;
    } // NSLog(@"tmp size is %.2f",totalSize); return totalSize;
}

3.在设置里这样使用

#pragma 清理缓存图片   

- (void)clearTmpPics  
{  
    [[SDImageCache sharedImageCache] clearDisk];  

//    [[SDImageCache sharedImageCache] clearMemory];//可有可无   

    DLog(@"clear disk");      

    float tmpSize = [[SDImageCache sharedImageCache] checkTmpSize];  

    NSString *clearCacheName = tmpSize >= 1 ? [NSString stringWithFormat:@"清理缓存(%.2fM)",tmpSize] : [NSString stringWithFormat:@"清理缓存(%.2fK)",tmpSize * 1024];  

    [configDataArray replaceObjectAtIndex:2 withObject:clearCacheName];  

    [configTableView reloadData];  
}  

iOS基于SDWebimage和urlConnection简单的带进度条图片加载

第一次写csdn 请多多关照 注: objc/runtime.h  Objecitve-C的重要特性是Runtime(运行时),在Interacting with the Runtime(交互运行...
  • zaq962hf
  • zaq962hf
  • 2015年03月18日 13:41
  • 718

iOS-SDWebImage的使用和实现原理

日常开发中,经常需要下载网络图片,最常用到的第三方库莫过于SDWebImage了,github托管地址https://github.com/rs/SDWebImage,下面简要介绍下SDWebImag...
  • coyote1994
  • coyote1994
  • 2016年09月02日 22:15
  • 1625

iOS开发:SDWebImage基本原理和使用

一、SDWebImage基本原理 SDWebImage是当下最流行的一个三方图片处理框架,它的强大之处相信只要是iOS开发人员就体会过,我们只需要用一句代码[[UIImageView new] sd...
  • indulgeIn
  • indulgeIn
  • 2016年04月12日 10:11
  • 4721

检测SDWebImage有没有缓存图片 IOS 获取网络图片大小

NSURL *url = [NSURL URLWithString:[model.content objectForKey:@"image"]];             //请求网络地址数据的同步方...
  • sxq609004460
  • sxq609004460
  • 2015年10月14日 14:49
  • 583

关于使用SDWebImage内存爆涨的问题

这几天在做一个需求,需要在一系列的控制器里下载N张图片。最方便最省事的解决方案当然首选SDWebImage这个框架(相信也很少不去用它的)。把图片地址放进去,返回一个图片,轻松,快捷,令人幸福,直到看...
  • qq_30513483
  • qq_30513483
  • 2016年07月15日 13:56
  • 5269

iOS开发之SDWebImage的使用

SDWebImage是iOS开发中一个常用的第三方库,主要用于图片的显示和缓存,可以用很简单的代码实现网络图片的显示并缓存到本地,下面记录的是SDWebImage的用法: 1、xcode新建项目Tes...
  • yubo_725
  • yubo_725
  • 2016年04月05日 12:52
  • 1381

SDWebImage如何支持的WebP格式

4g时代,流量依然是宝贵的东西。而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题。我们关注的问题,无非是图片体积和质量如何达到一个比较和谐的平衡,希望得到质量不错的...
  • sinat_31484193
  • sinat_31484193
  • 2016年05月31日 09:44
  • 5184

iOS 下载缓存网络图片 SDWebImage

SDWebImage 是一个开源的第三方库,它提供了 UIImageView 的一个分类,以支持从远程服务器下载并缓存图片的功能。...
  • u010551118
  • u010551118
  • 2016年06月18日 21:47
  • 2764

SDWebImage的运行机制以及缓存大小、有效时间设置

转载地址:http://www.cocoachina.com/ios/20141212/10622.html 我之前写过一篇博客,介绍缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存...
  • wangfeng2500
  • wangfeng2500
  • 2015年12月16日 17:59
  • 5574

iOS 缓存机制 (以SDWebImage 缓存图片为例)

在iOS开发过程中,经常要用到缓存机制,那么如何较为好的设计一个缓存机制呢?在这里,小编以SDWebImage为例,说一下这个缓存机制: UIImageView+WebCache: setImage...
  • lf644206005
  • lf644206005
  • 2015年10月26日 14:54
  • 571
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 图片缓存之SDWebImage
举报原因:
原因补充:

(最多只允许输入30个字)