AF&SD

384 阅读4分钟
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