NSMaptable需要熟悉一下,很多地方都有,还有NSProxy(伪代理)
SDWebImage
4.0->5.0(改动)
- 解码类与manager的关系变更,由
组合变为聚合,进行了分类化
加载图片流程
1.图片是在网路还在是在本地
所有的operation都存储在一个全局的NSMaptable,
每次进行新的任务之前,都会对operation进行比对,
判断之前是否有相同的任务
- 初始化一些参数:总进度、manager
- loadImageWithURL(具体产生业务逻辑的方法)
- 加载完成之后显示(当前的图片是否需要处理,So会暴露部分自定义的api给外部)
1.两个关键的operation
2.1 SDWebImageAvoidAudioSetImage,是否需要自动设置image
2.2 SDWebImageDelayPlaceholder,是否需要延迟设置placeholder
2.如果需要刷新则[self setNeedsLayout]标记当前UI需要刷新
图片缓存
下载模块(内存和磁盘双缓存)
issue:
1.当图片特别大得时候,进行缓存,会使占用内存暴增怎么处理
2.shouleUseWeakMenoryCache是做什么用的? ->是否需要SDWeb进行缓存
3.为什么Cache需要存两遍?->因为NSCache是不可控的,不知道系统什么时候会清空
内存缓存(SDMenoryCache:NSCache)的实现
- 为什么要自己声明SDMenoryCache不用系统的NSCache?
1.NSCache的生命周期,由系统管理,我们无法控制
- 为什么不用NSDcitionary而用NSMaptable来实现weakCache?
1.NSMaptable可以提供更多的内存语义
1.1 初始化的时候指定了key为strongMenory,value为weakMenory,
value存在于全局的weak表中,当我们的maptable被释放的时候,weakValue会被释放,strongKey会被保留下来做接下来的对比
2.如果使用NSDictionary,当外部缓存进来的对象实现了NSCopy协议,会改变内存??????????(待研究)
3.监听了(didReceiveMenoryWarning:),当内存不足时,清除缓存
4.重写了NSCache方法
4.1 - (void)setObject:(id)object forKey:(id)key cost:(NSIntager)g
首先,会调用Super在NSCache中进行缓存(NSCache中会有一个数组或者链表之类的数据结构来存储 ),然后才是SDCache的缓存
!!!!!(Issued,第二个问题)
在这里会根据SDCacheConfig中的shouleUseWeakMenoryCache来判断
NO->存储在NSCache的存储结构中
YES->存储在SDCache的NSMaptable中
1. -(id)objectForKey:(id)key
1.1 如果shouleUseWeakMenoryCache->NO && 读取到了内存缓存,直接返回
1.2 如果没读取到NSCache,才会读取SDCache的NSMaptable中的缓存,并且赋值给NSCache
磁盘缓存的实现
1.找到的的image文件名进行md5转换
1.先查找内存缓存
2.miss则查找硬盘缓存
3.找到后,进行双缓存
下载模块
downloader&&operation
1.downloader是管理类,对一些block和config进行管理
1.配置下载相关的参数
2.下载队列的先后顺序
3.最大任务数
4.HTTPS
5.cookie,header,用户认证
6.下载任务优先级的控制
1.怎么控制优先级的?
1.先进先出
2.后进先出
2.operation对下载的任务自定义生命周期
3.NSUrlSeesion(补充)
4.NSOperation-GCD (补充)
AFNetworking
Https
1.https的流程
1.向服务端发送SSL信息
2.服务端返回客户端SSL,版本信息,以及服务端 !公钥!(拿到公钥)
3.客户端校验证书是否合法,合法继续,否则警告
4.发送自己支持的对称加密方案给服务端
5.服务端选择加密程度高的加密方式
6.服务端把自己选择好的机密方式发送给客户端
7.客户端收到加密方式后,产生随机码,作为对称加密的秘钥,使用公钥加密后,发给服务端(使用协商的算法加密随机数,使用公钥加密发给服务端)
8.私钥解密,获得加密秘钥
9.对称加密,进行通讯
2.根证书是做什么的?
3.服务端401错误:需要用户端信息
图片缓存
YYImage(异步绘制) 待续
图片格式是如何判断的
加载动图原理
1. 把图片数组转换为二进制
2. 计时器(CADisPlayLink)播放
dataBuff->frameBuff->imageBuff
1.dataBuffer
2.frameBuffer:每一帧图片
animate