0%

SDWebImage 源码分析

How is SDWebImage better than X?

开篇,我先翻译一下 SDWebImage 官方介绍中的这篇文章:How is SDWebImage better than X?

  • 从 iOS5.0 开始 NSURLCache 会处理磁盘缓存,那么使用 SDWebImage 相比于单纯使用 NSURLRequest 强在哪里呢?

    确实从iOS5.0开始,NSURLCache 会在内存及磁盘中缓存 HTTP 响应的原始数据。但是每次缓存命中,应用都需要数据解析(HTTP 原始数据是编码的)、内存拷贝等大量的操作将原生的缓存数据转换进UIImage对象中。
    另一方面,SDWebImage 在内存中缓存了 UIImage 对象,并在磁盘中存储了图片文件的原始压缩数据(已解码)。UIImage 对象使用 NSCache 按原样存储在内存中,所以在使用时并不需要拷贝,而且可以在应用或系统需要时随时释放内存。
    除此之外,SDWebImageDecoder 将 UIImageView 首次使用 UIImage 对象的解压缩工作放在了后台线程中而不是通常的主线程中,可以减少主线程堵塞。
    最后,SDWebImage 完全绕过了复杂且易出错的 HTTP 缓存控制配置,从而极大的加速了缓存查找。

  • 既然 AFNetworking 为 UIImageView 提供了相似的功能,SDWebImage 还有用嘛?

    大概没啥用,AFNetworking 也是利用了基于 Foundation 框架的 URL 加载系统缓存:NSURLCache,还为 UIImageView 和 UIButton 提供了默认使用 NSCached 的可配置内存缓存。缓存行为可以根据相应的 NSURLRequest 来配置。AFNetworking 还提供了图片数据的后台解压缩等 SDWebImage 的特性。
    因此如果你已经使用了 AFNetworking,而且只想要简单的异步图片加载分类,内置的 UIKIT 框架也够用了。