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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容