SDWebView的uml图结构如下
1.整体架构
个人理解
1.UIImageView+WebCache, UIButton+WebCache之类主要是用来做UIKit提供接口
2.SDWebImageManager是总的管理类,维护SDWebImageDownloader实例和一个SDImageCach实例,是下载和缓存的桥梁
3.SDWebImageDownloader:负责维护图片的下载队列
4.SDWebImageCache:负责图片的缓存
5.SDWebImageCoder:负责图片的解压缩
6.SDWebImagePrefetcher:负责图片的预加载
7.SDWebImageDownloaderOperation:负责图片真正的下载
其中最重要的就是SDWebImageDownloader,SDWebImageCache,SDWebImageManager。
2.缓存流程
SDWebImage缓存的流程也是老生常谈了
1.给UIImageView设置图片
2.取消对应的UIImageView的图片相关操作
3.预加载的图片URL是否为空,为空则报错处理
4.生产图片URL对应的key
5.使用key读取内存和磁盘缓存
6.若有缓存则读取图片,设置对应的控件
7.无缓存则下载图片,图片处理,将图片保存到缓存,然后设置对应的UIImageView
3.小知识
1.dispatch_async_safe
主线程与主队列的关系:主队列一定是在主线程中运行,但是主线程中可以运行除了主队列以外的其他队列。最简单的验证方式就是在主线程中调用dispatch_sync,这样操作会将block中的内容安排到主线程中运行
dispatch_sync(dispatch_queue_create("com.test.aa", DISPATCH_QUEUE_CONCURRENT), ^{
NSLog(@"3");
NSLog(@"%s, isMainThread:%d", dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), [NSThread isMainThread]);
});
在主线程中运行如上代码打印如下
2022-05-25 13:51:29.455596+0800 SSWebVIew[28266:8400272] com.test.aa, isMainThread:1
2.SDImageCache类
memoCache输入NSCache,专门处理内存缓存,NSCache是苹果官方提供的缓存类,和NSMutableDictionary类似,但是又有区别。NSCache是线程安全的,NSCache的Key只是对对象的强引用,不拷贝,这点与NSDictionary有区别