美文网首页
SDWebImage

SDWebImage

作者: 彼岸的黑色曼陀罗 | 来源:发表于2016-10-13 21:23 被阅读0次

    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

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