SDWebImageManager
负责管理图片的检查、下载,以及对这些操作进行管理。
SDWebImageManager
SDImageCache
- 内存缓存管理使用NSCache。
- 外部缓存管理使用文件归档(UIImage 转换成 NSData)的方式。
- 使用UIApplicationDidReceiveMemoryWarningNotification,作为进行缓存回收的时机。这一点跟YYCache有区别,YYCache是使用LRU算法对缓存进行清理。
SDWebImageDownloader
在主线程中调用dispatch_barrier_sync, 在self.barrierQueue放置的block中进行定义SDWebImageDownloaderOperation,并把该operation放置到 downloadQueue中。
SDWebImageDownloaderOperation
自定义的NSOperation并发操作。
SDWebImageDecoder
为什么要对图片进行解码?难道不能直接使用上面的两种加载方式直接进行加载显示吗,答案是可以,而且大概我们编码都是使用上面的两种方式直接在主线程加载图片然后显示在UIImageView上,并且并没有发现什么问题。那为什么SDWebImage 还要费劲去进行解码图片呢,其实我们自己不解码图片我们也是可以直接使用的(其实是系统为我们进行了解码的操作),一般下载的图片或者我们手动拖进主bundle 的图片都是PNG 或者JPG 其他格式的图片,这些图片都是经过编码压缩后的图片数据,并不是控件可以直接显示的位图,如果我们直接使用 "+ (nullable UIImage *)imageNamed:(NSString *)name" 来加载图片,系统默认会在主线程立即进行图片的解码工作,这个过程就是把图片数据解码成可供控件直接显示的位图数据,由于这个解码操作比较耗时,并且默认是在主线程进行,所以当在主线程调用了大量的 "+ (nullable UIImage *)imageNamed:(NSString *)name" 方法后就会产生卡顿。(同时由于位图体积较大,所以在磁盘缓存中不会直接缓存位图数据,而是编码压缩过的PNG 活着JPG 数据)
为了解决这个问题,我们有两种功能比较简单的处理方法:
1.使用 "+ (nullable UIImage *)imageWithContentsOfFile:(NSString *)path" 获取到图片
2.自己解码图片,并且把解码过程放在子线程
参考文档1
参考文档2
网友评论