SDWebImage 源码阅读分享
SDWebImage 源码阅读分享
疑问列表
- SDWebImage 整体框架图,主要的类包含哪些
- SDWebImage 如何进行缓存管理,过期失效策略,缓存更新
- SDWebImage 如何多线程处理的过程中,如何处理并发,并发数是多少,是否使用了锁机制
- 缓存的异步处理
SDWebImage 结构图
- UIImageView+WebCache 分类扩展,方便调用
- SDWebImageManager 统一管理
- SDWebImageDownloader 下载缓存池
- SDImageCache 缓存模型
- 两层缓存模式,memory cache + disk cache
- 先查找memory找不到会找disk, 可选方法,可以选择不找disk
- cache使用NSURL作为key, 对于动态URL(访问控制考虑),可以使用一个将URL作为输入,生成一个NSString作为key, 通过去掉可变的部分来做到的。
- 对于静态URL设置永不过期,可以在调用的时候手动传入更新参数
SDImageCache
- 使用NSCache来做缓存,收到memoryWarning的时候清除全部的缓存
- 缓存时间默认是1周
- 使用dispatch_queue_t 线性队列来做文件操作的多线程互斥管理
dispatch_async(self.ioQueue, ^{
NSData *data = imageData;
····
[sself writeDataToDisk];
}
- 区分png和jpeg,png有固定的前缀头信息
The first eight bytes of a PNG file always contain the following
(decimal) values:// 137 80 78 71 13 10 26 10
SDWebImageDownloader
maxConcurrentDownloads 最大并发数的控制
currentDownloadCount 当前正在下载的数量
downloadTimeout 15秒超时下载
executionOrder 默认先进先出下载,也可以设置后进先出下载
- 怎么实现的:保留最后一次operation,同时给opreation设置dependency来做到后进先出的
if (wself.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) {
// Emulate LIFO execution order by systematically adding new operations as last operation's dependency
[wself.lastAddedOperation addDependency:operation];
wself.lastAddedOperation = operation;
}
(void)setSuspended:(BOOL)suspended; 挂起下载队列
(void)cancelAllDownloads; 取消下载队列中的所有下载任务
使用了NSOperationQueue 来进行下载任务的并发控制,最大并发数为6 - 使用了NSURLSession进行下载
dispatch_queue_t barrierQueue 用并发队列来处理并发回调间的同步问题
压缩图片默认开启
在当前线程中栅栏执行block dispatch_barrier_sync(sself.barrierQueue, ^{ });
在并发线程中栅栏执行block
dispatch_barrier_async(sself.barrierQueue, ^{ });URLCallbacks 字典保存回调
failedURLs 保存所有失败的请求,不在一直尝试下载,除非有声明失败后重新下载
使用NSURLSession进行下载,在代理回调中组合ImageData,进行认证判断
SDWebImageDownloadOperation
- 使用了NSURLSession进行下载,delegate回调中处理出入的block
- 使用NSNotification 发布放到主线程执行,原因参考Notification与多线程
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadReceiveResponseNotification object:self];
});
NSCache 是否是线程安全的?NSFileManager是否是线程安全的?哪些对象是线程安全的
补充知识
NSURLSession
NSURLSessionTask
NSURLSessionDataTask 兼有下载和上传,但是不如后两者细节强大
NSURLSessionUploadTask 上传
NSURLSessionDownloadTask 下载服务
NSURLSessionStreamTask 面向tcp/ip
NSURLSessionDelegate
NSURLSessionTaskDelegate
NSURLSessionDataTaskDelegate
NSURLSessionUploadTaskDelegate
NSURLSessionDownloadTaskDelegate
SDWebImage 源码阅读分享的更多相关文章
- 【原】SDWebImage源码阅读(五)
[原]SDWebImage源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 前面的代码并没有特意去讲SDWebImage的缓存机制,主要是想单独开一章节专门讲 ...
- 【原】SDWebImage源码阅读(四)
[原]SDWebImage源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 SDWebImage中主要实现了NSURLConnectionDataDelega ...
- 【原】SDWebImage源码阅读(三)
[原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们 ...
- 【原】SDWebImage源码阅读(二)
[原]SDWebImage源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 解决上一篇遗留的坑 上一篇中对sd_setImageWithURL函数简单分析了一下,还 ...
- 【原】SDWebImage源码阅读(一)
[原]SDWebImage源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 一直没有系统地读过整套源码,就感觉像一直看零碎的知识点,没有系统读过一本专业经典书 ...
- SDWebImage源码阅读-第三篇
这一篇讲讲不常用的一些方法. 1 sd_setImageWithPreviousCachedImageWithURL: placeholderImage: options: progress: com ...
- SDWebImage源码阅读-第一篇
一 题外话 之前写过一篇最新版SDWebImage的使用,也简单的介绍了一下原理.这两天正梳理自己的知识网络,觉得有必要再阅读一下源码,一是看具体实现,二是学习一下优秀开源代码的代码风格,比如接口设计 ...
- SDWebImage源码阅读-第二篇
一 SDWebImageManager的downloadImageWithURL的方法 上一篇,我们刚开了个头,分析了一下开始加载图片之前如何取消其他正在下载的任务,接着,我们回到 - (void) ...
- 【原】AFNetworking源码阅读(五)
[原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...
随机推荐
- Word Puzzles
poj1204:http://poj.org/problem?id=1204 题意:给你n*m的字符串矩阵,然后p个查询,每个查询会给出一个字符串,然后问你在矩阵中能否通过8个方向搜索到这个字符串,输 ...
- Linux Screen命令使用
参考URL: http://jingyan.baidu.com/article/295430f128d8ea0c7e005089.html ~~~~~~~~~~~~~~~~~~~~~~~~ 其它的不提 ...
- Android 向系统发送一条短信
s //向系统写一条短信 ContentValues contentValues = new ContentValues(); contentValues.put("body",& ...
- 【poj3734】矩阵乘法求解
[题意] 给N个方块排成一列.现在要用红.蓝.绿.黄四种颜色的油漆给这些方块染色.求染成红色方块和染成绿色方块的个数同时为偶数的染色方案的个数,输出对10007取余后的答案.(1<=n<= ...
- OA学习笔记-009-岗位管理的CRUD
一.分析 Action->Service->Dao CRUD有功能已经抽取到BaseDaoImpl中实现,所以RoleDaoImpl没有CRUD的代码,直接从BaseDaoImpl中继承 ...
- 生意经:研究一下国外SAAS的产品线,比如Salesforce、Netsuite和Zendesk等等(Salesforce斥资7.5亿美元收购云计算字处理应用Quip)
看他们做什么,我就做什么-甚至比他们做的更好. ------------------------------------------------------------ 新浪科技讯 北京时间8月3日下 ...
- Spring-boot 配置Aop获取controller里的request中的参数以及其返回值
首先在你的Maven的pom文件里加入aop的依赖: <dependency> <groupId>org.springframework.boot</groupId> ...
- 原生态Ajax实例
<script type="text/javascript"> var xmlhttprequest; function GetXmlHttpRequest() { i ...
- android自动化(2)
使用monkeyrunner 自动化删除程序的时候出现如下错误 在任务管理器卸载android adb,Ok..然后再次使用的时候就出现这个问题, Try below steps: Close the ...
- 16位cpu下主引导扇区及用户程序的编写
一些约定 主引导扇区代码(0面0道1扇区)加载至0x07c00处 用户程序头部代码需包含以下信息:程序总长度.程序入口.重定位表等信息 用户程序 当虚拟机启动时,在屏幕上显示以下两句话: This i ...