SDWebImage

SDWebImage

SDWebImage框架的基本使用

  • 以前框架没有用sd开头

用法一:分类:UIImageView+WebCache.h

  • sd_setImageWithURL:placeholderImage:options:progress:completed:
    • 参数一:下载图片的URL
    • 参数二:占位图片
    • 参数三:额外选项(),如果不需要就传0
      • 枚举值
        • failed下载失败尝试重新去下载,一张图片如果下载图片了会放到黑名单里,如果想要重新下载需要传入这个枚举值
        • LowPriority:当scrollView滚动的时候停止下载
        • CacheMemoryOnly:只做内存缓存
        • ProgressiveDownload:渐进式下载
        • RefreshCached:刷新缓存,非常重要,开发中常用,
          • url:ww.baidu.comm/abc.png ->图片1,内存缓存|磁盘缓存
          • url:www.baidu.com/bce.png->图片2,需要做刷新缓存,否则不会去下载
        • continueInBackground:
        • HandleCookies
        • AllowInvalidsslcERTIFICATES
        • HighPriority
        • DelayPlaceholder
        • …………
    • 参数四:进度回调,可以知道图片下载了百分之多少
      • receivedSize:已经下载的数据大小
      • expectedSize:图片的总大小
      • 进度=1.0*receviedSize/expectedSize
    • 参数五:completed完成之后的回调,完成不等于成功
      • image:下载的图片
      • error:错误信息
      • cacheType:缓存类型(枚举)
        • None
        • Disk:磁盘缓存
        • Memory:内存缓存
      • imageURL:图片的url
  • 如果需要监听下载进度的时候用这个方法

用法二 :SDWebImageManager

  • 只是想得到图片
  • 单例
  • 类方法:[SDWebImageManager sharedManager]downloadImageWithURL:options:progress:completed:
    • 简洁的单例模式
  • 核心方法downloadImageWithURL:内部做了什么?
    • 加载图片的核心方法,如果URL对应的图像在缓存中不存在,那么就下载指定的图片,否则就返回缓存的图像
    • 容错处理:判断url是否争取,如果是string类型,那么尝试转化
    • 初始化一个SDWebImageCombinedOperationBlock块
    • 初始化设定该url是正确的isFailedURL = NO
    • 加互斥锁,检索请求图片的URL是否在曾下载失败的集合中(url黑名单)
    • 如果url不正确,或者选择的下载策略不是[下载失败尝试重新下载]且该url存在于黑名单中,那么直接返回,回调任务完成block块,传递错误信息
    • 该宏保证了completedBlock回调在主线程中执行
    • 加互斥锁,把当前的下载的任务添加到正在执行任务数组中,得到该url对应的缓存key
    • queryDiskCacheForKey:done:该方法查找URLKEY对应的图片缓存是否存在,查找完毕之后,把该图片(存在|不存在)和该图片的缓存方法以block的方式传递,缓存情况查找完毕之后,在block块中进行后续的处理(如果该图片没有缓存,下载|如果缓存存在 |如果用户设置了下载缓存策略是刷新缓存如何处理等等)

用法三:播放gif图片

  • 分类:UIImage+GIF
  • self.imageView.image = [UIImage sd_animatedGIFNamed:@"test"];
    • 不用加.gif的后缀名,内部自动就添加了

SDWebImage内部结构

  • 核心方法:sd_setImageURL:placeholder:options:progress:completed:
    • 图片的二进制数据
    • 占位图片
    • 图片下载选项
    • 进度回调
    • 完成回调
  • 步骤:
取消当前图片下载
self sd_cancelCurrentImageLoad
利用运行时retain url
objc_setAssociatedObject(self,&imageURLKey,url,OBJC_ASSOCATTON_RETAIN_NONATOMIC);
判断,如果传入的下载策略不是延延迟显示占位图片,那么在主线程中设置展位图片
如果url不为空,检查activityView是否可用,实例化SDWebImageOperation操作
核心方法downloadImageWithURL:options:progress:completed:,移除UIActivityIndicatorView,如果图片下载完成,且传入的下载选项为手动设置图片,则直接执行completed回调,并且返回;否则,如果图片存在,则设置图片到UIImageView上面,并刷新重绘视图

  • 整体结构
    • Categories:分类
      • UIImageView+WebCache
      • 内部调用的downloadImageWithURL
    • Cache:缓存处理器
    • Download:图片下载处理器
      • 怎么开子线程下载图片
      • SDWebImageDownloaderOperation
      • addOperation-->start-->main
    • Manager:管理者
    • Utils:公共组件

内存警告处理

  • 没有使用框架

    • didReeiveMemoryWarning
      • 清除内存缓存removeAllObjects
      • 取消队列中所有的任务cancelAllOperations
  • 使用框架

    • 很多控制器都需要用到框架下载图片,可以在appDelegate做统一处理
    • applicationDidRecevieMemoryWarning:
      • 清除内存中的缓存[[SDWebImageManager sharedManager].imageCache clearMemory]
      • 清除磁盘缓存
        • clearDisk
        • cleanDisk
      • 取消队列中的任务[[SDWebImageManager sharedManager] cancelAll];

SDWebImage框架实现细节

  • clean/clear区别?
    • imageCache属性,clear和clean是SDImageCache类的方法
    • clear
      • clearDiskOnCompletion:
      • 开子线程异步处理清理磁盘缓存的操作
      • 删除缓存文件夹
      • 重新创建缓存目录
      • 到主线程中处理completion回调
      • clear:先把之前的缓存文件删除,然后重新创建一个新的文件(空的)
    • clean
      • cleanDiskOnCompletion:
      • 先删除过期的缓存,接下来计算剩余缓存的大小,得到该大小之后和设定的最大缓存大小进行比较,如果超出那么就继续删除,直到小于或等于为止
  • 多久算过期?过期时间是多久?

    • 过期时间:默认为一周
    • SDImageCache
      • maxCacheAge
      • initWithNameSpace:
  • 该框架支持GIF图片播放:内部是怎么实现的?

    • UIImage+GIF

    • sd_animatedGIFImage:

    • sd_animatedGIFWithData:

      • 创建图像源
      • 获得图片帧数
      • 创建空的可变的图形数组
      • 遍历并且提取所有的动画帧
      • animatedImageWithImages:duration:
    • 注意点:创建图像源需要包含的类库ImageIO

  • 请求超时时间:15s,只给15s的时间下载,超过15s则下载失败

  • 缓存地址(路径)

    • ~/Library/Caches/default/com.hackemist.SDWebImageCache.default/文件名称
  • 磁盘缓存文件的名称:对URL进行MD5加密(MD5散列计算)

    • echo -n "URL" |md5
  • 缓存策略:默认情况下既做内存缓存又做磁盘缓存,下载图片前先检查内存缓存,再检查磁盘缓存

  • 缓存的实现方式:采用了苹果推出的用来处理缓存类的NSCache

    • 思考:NSCache和字典的区别是什么?
  • 框架内部允许的最大并发数:6

  • 对系统内存警告的处理方式:框架内部监听系统内存警告的通知,当发生后移除内存缓存中的所有对象

  • 下载对列中对多个图片任务的处理方式:提供了FIFO和LIFO两种方式,默认为FIFO

  • 如何下载图片?

    • 采用发送NSURLSession网络请求
  • 判断图片类型的方式:

    • 只判断该图片二进制数据的第一个字节
    • NSData的一个分类(ImageContentType)打开图片以十六进制的方式打开
    • .jpeg Oxff
    • .png Ox89
    • .gif Ox47

你可能感兴趣的:(SDWebImage)