SDWebImage Note

这是笔者学习 SDWebImage 源码时的笔记,对它有着很深的怨念呢。😊

功能

SDWebImage 提供的主要功能如下:

  • 提供异步图片(后台)下载并保证不阻塞主线程;
  • 支持内存和磁盘双缓存策略,保证同一 url 不会请求多次;
  • 支持 WebP/Gif 等格式;

结构

SDWebImageManager 协调 SDImageCacheSDWebImageDownloader 这两个模块的工作,内部使用自定义的 SDWebImageCombinedOperation 直接或间接引用对图片的缓存查询以及下载的操作,便于取消。

sdwebimg_struct.png

原理

对于每一次的图片下载操作,imageManager 让 cacheManager 去缓存中查找,由于在内存缓存中查找的速度很快,所以只在对磁盘缓存查询时,才异步在 ioQueue 中执行查询任务,避免阻塞主线程。查询完成之后,imageDownloader 开始工作,如果 “所需缓存不存在/缓存过期/ SDWebImageRefreshCached 开启”,downloader 就会产生一个 loaderOperation(继承于 NSOperation)放入 downloadQueue,等待启动。一旦操作启动, urlConnection 去下载图片数据。这个操作是在子线程去执行的,为了能保证接收到 urlConnection 回调回来的数据,不能让这个线程把 -start 内的的代码执行完,就结束自己的生命,所以需要 runLoop 去驱动线程接收数据,直到 “数据接收完成/发生错误/主动取消操作” 才停止这个runLoop,接收完成了之后发送通知并执行预设的 block。

性能

SDWebImage 的源码中有两个地方提到 ‘performance’ 这个词:

  • shouldDecompressImages 这个 flag 中的注释,提到了如果开启了这个 flag 可以提高性能,换来的代价是消耗更多的内存。要弄懂 shouldDecompressImages 的意义必须先了解图片从读取到显示的过程

      1. 从磁盘拷贝数据到内核缓冲区
      2. 从内核缓冲区复制数据到用户空间
      3. 生成 UIImageView,把图像数据赋值给 UIImageView
      4. 如果图像数据为未解码的 PNG/JPG,解码为位图数据
      5. CATransaction 捕获到 UIImageView layer 树的变化
      6. 主线程 Runloop 提交 CATransaction,开始进行图像渲染
          6.1 如果数据没有字节对齐,Core Animation 会再拷贝一份数据,进行字节对齐
          6.2 GPU处理位图数据,进行渲染
    

在这个过程中我们可以看到,如果我们直接将未经解码的图像数据传递给 UIImageView 对象,那么该对象就会在主线程中去解码图像数据,在图片特别大的情况下耗时相应的也会特别多,因此 SDWebImage 在解码图片这一步上做了优化,放到了子线程中执行,这样拖动 tableView 的时候不至于阻塞主线程。

  • SDWebImageRefreshCached 这个 flag 中的注释提到,使用 NSURLCache 而非 SDWebImageCache 会降低一点性能。因为对于每个 HTTP 请求,我们都可以对 NSURLCache(如果使用)设置相应的缓存策略。通常在响应返回之后,客户端缓存这一份数据,通过响应头的 Expires, Cache-Control 等字段决定这份缓存什么时候过期。如果缓存过期,HTTP 允许缓存端发送条件 GET 请求到服务器,询问这份缓存的内容是否仍然是“新鲜的”。如果服务器对原来客户端缓存过的数据进行了更改,那我们就有必要从服务器中再取一份数据。综上,如果某个 url 对应的资源时常发生变动,那么我们应该启用 NSURLCache,而图片通常是静态的,所以启用 SDWebImageCache 可以跳过询问缓存是否新鲜这个步骤,提高一点查询速度。

总结

有更好的网络图片加载库吗?当然,据闻 FastImageCache 和 YYWebImage 做的优化似乎更多。

然而现在只能等有空的时候再膜一番了。

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

推荐阅读更多精彩内容