SDWebImage源码分析

作者: flowerflower | 来源:发表于2017-02-16 22:04 被阅读65次

使用SDWebImage无非就是做图片缓存

一起来看下SDWebImage的几种使用方式:SDWebImage下载地址

1. sd_setImageWithURL:
//图片缓存的基本使用
   [self.newImageView sd_setImageWithURL:[NSURL URLWithString:model.newsImage]];

2. sd_setImageWithURL: placeholderImage:
//设置默认图片,先使用默认图片,当图片加载完成后再替换 
    [self.newImageView sd_setImageWithURL:[NSURL URLWithString:model.newsImage] placeholderImage:[UIImage imageNamed:@"default"]];
3.sd_setImageWithURL: placeholderImage: options:
//options 选择方式
    [self.newImageView sd_setImageWithURL:[NSURL URLWithString:model.newsImage] placeholderImage:[UIImage imageNamed:@"default"] options:SDWebImageRetryFailed];
4.sd_setImageWithURL: completed:
//用block 可以在图片加载完成之后做些事情
    [self.newImageView sd_setImageWithURL:[NSURL URLWithString:model.newsImage]  completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
         //在图片加载完成之后
     ......
    }];
5.sd_setImageWithURL: placeholderImage: completed:
  [self.newImageView sd_setImageWithURL:[NSURL URLWithString:model.newsImage] placeholderImage:[UIImage imageNamed:@"default"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
         //图片加载完成后做的事情
      ......
         
    }];

总结

没有带options方法的话,说明是内存缓存和磁盘缓存结合的方法,如果只是需要内存缓存,那么在调用- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options,只需要options设置成将options:SDWebImageCacheMemoryOnly即可。例如:

    [self.iamgeView sd_setImageWithURL:[NSURL URLWithString:model.newsImage] placeholderImage:[UIImage imageNamed:@"default"] options:SDWebImageCacheMemoryOnly];

options的所有枚举类型

typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
  //失败后重试
    SDWebImageRetryFailed = 1 << 0,
//UI交互期间开始下载,导致延迟下载比如UIScrollView减速
    SDWebImageLowPriority = 1 << 1,
     //只进行内存缓存
    SDWebImageCacheMemoryOnly = 1 << 2
 / /这个标志可以渐进式下载,显示的图像是逐步在下载
    SDWebImageProgressiveDownload = 1 << 3,
     //刷新缓存
    SDWebImageRefreshCached = 1 << 4,
     //后台下载
    SDWebImageContinueInBackground = 1 << 5,
//NSMutableURLRequest.HTTPShouldHandleCookies = YES;
    SDWebImageHandleCookies = 1 << 6,
    //允许使用无效的SSL证书  
    SDWebImageAllowInvalidSSLCertificates = 1 << 7,
   //优先下载
    SDWebImageHighPriority = 1 << 8,    
  //延迟占位符
    SDWebImageDelayPlaceholder = 1 << 9,
     //改变动画形象
    SDWebImageTransformAnimatedImage = 1 << 10,
    
    SDWebImageAvoidAutoSetImage = 1 << 11
};

SDWebImage内部实现过程

1.入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。
2. 进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.
3.先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
4. SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。

5.如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。

6.根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。

7.如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。

8.如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。

9.共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。

10.图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。

11.connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。

12.connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。

13.图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。

14.在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。

15.imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。

16.通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。

17.将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。

18.SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。

19.SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。

20.SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

相关文章

  • SDWebImage 源码分析

    SDWebImage 源码分析 首先我 fork 了 SDWebImage 的源码,见 conintet/SDWe...

  • SDWebImage源码分析

    SDWebImage源码分析 UIImageView+WebCache sd SDWebImageManager ...

  • SDWebImage源码分析

    技术无极限,从菜鸟开始,从源码开始。 由于公司目前项目还是用OC写的项目,没有升级swift 所以暂时SDWebI...

  • SDWebImage源码分析

    SDWebImage介绍 UIView+WebCache类别: 所有设置图片的方法内部都会且仅调用此方法 UIVi...

  • SDWebImage源码分析

    SDWebImage是专门用于图片下载的框架,内部封装了图片异步下载和缓存的过程,涉及到的知识点有:(1)runt...

  • SDWebImage源码分析

    SDWebImage库是一个支持缓存的异步图片下载库。为了方便使用,它提供了UIImageView, UIButt...

  • SDWebImage源码分析

    一、SDWebImage到底是什么 Asynchronous image downloader with cach...

  • SDWebImage源码分析

    使用SDWebImage无非就是做图片缓存 一起来看下SDWebImage的几种使用方式:SDWebImage下载...

  • 源码分析SDWebImage

    SDWebImage是一个开源的第三方库,它提供了UIImageView的一个分类,以支持从远程服务器下载并缓存图...

  • 源码分析SDWebImage

    /* *ThisfileispartoftheSDWebImagepackage. *(c)OlivierPoit...

网友评论

    本文标题:SDWebImage源码分析

    本文链接:https://www.haomeiwen.com/subject/pgghwttx.html