2020-02-28

网络通信模块 AFURLSessionManager、AFHTTPSessionManager
网络状态监听模块 Reachability
网络通信安全策略模块 Security
网络通信信息序列化/反序列号模块 Serialization
对于iOS UIKit库的扩展

调用父类的初始化方法
检测URL有值且最后一位不包含/,需要加上/
保存baseURL
请求序列对象、响应序列对象

quene并发线程数设置为1
各种响应转码
设置默认安全策略
加锁,确保多线程访问安全
置空task关联的代理
初始化一些属性,包括
mutableTaskDelegatesKeyedByTaskIdentifier 让每一个请求Task和我们自定义的AF代理建立映射用的
异步获取当前当前session的所有未完成的task 防止后台回来重新初始化这个Session,一些之前的后台请求任务,导致程序崩溃

生成一个Task,然后开始网络请求
将参数和各种东西转化为一个NSMutableURLRequest
如果解析错误,那么直接返回
用self.requestSerializer和各种参数去获取了一个我们最终请求网络需要的NSMutableURLRequest实例,并且在完成的回调里,调用我们传过来的成功和失败的回调

将request的各种属性循环遍历
将传入的参数进行编码并且添加到request中
AFHTTPRequestSerializerObservedKeyPaths() 是一个C函数返回一个数组
这个函数主要是封装了一些属性的名字 这些都是NSURLRequest的属性

self.mutableObservedChangedKeyPaths
在init方法对这个集合进行了初始化,并且对当前类的和NSURLRequest的相关属性进行了KVO监听
当观察到这些set方法被调用了,而且不为Null就会添加到集合里,否则移除
这个属性其实是我们自己设置的request属性的集合

[mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath];
用KVC的方式,把属性值都设置到我们请求的request中去
将传入的参数进行编码,并且设置到request中去
判断该Request中是否包含了GET,HEAD,DELETE。POST、PUT是把query拼接到Http body中的
设置请求头、请求体
从自己的head里去遍历,如果有值则设置给request的head
把各种类型的参数,array,dic,set转化成字符串,给request
具体怎么实现容器类型的参数转换为字符串类型的参数
紧接着根据请求类型,判断参数字符串如何设置到request中去。如果是GET、HEAD、DELETE,则把参数query拼接到url的后面。而POST、PUT是吧query拼接到http body中

完成初始化方法
生成一个request

调用父类的生成Task方法,并且执行了一个成功和失败的回调
创建NSURLSessionDataTask
为什么用同步,因为想要主线程等在这,执行成功再返回,只有执行完dataTask才有数据,传值才有意义
为什么要用串行队列,防止iOS8以下内部的dataTaskWithRequest是并发创建的,会导致taskIdentifiers这个属性值不唯一,因为后续要用taskidentifiers来做为key对应delegate
保证即使在多线程的环境下,也不会创建其他队列

为什么不直接调用 dataTask = [self.session dataTaskWithRequest:request] 为了适配iOS8以下,创建session的时候,偶发的情况会出现session的属性taskIdentifiers这个值不唯一,而这个taskIdentifiers是为了后来我们映射delegate的key,所以他必须是唯一的。

AFURLSessionManagerTaskDelegate和AFURLSessionManager建立相互关系
设置AF delegate 的上传进度块,下载进度块
加锁,保证字典线程安全
为AF delegate 设置task的progress监听
添加task开始和暂停的通知
如果task触发KVO,则给progress进度赋值,因为赋值了,所以会触发progress的KVO,也会调用到这里,然后执行我们传进来的downloadProgress 和uploadProgressBlock 为了让进度实时的传递
线程、锁、性能各方面权衡

1、初始化动画,并设置动画属性
2、设置动画属性初始值、结束值、以及其他属性
3、绘图层添加动画

Core Animation
核心动画:基础动画、关键帧动画、动画组、转场动画
将基础动画添加到动画组,最后将动画组添加到图层
CABasicAnimation
CAKeyframeAnimation

创建转场动画
设置转场类型、子类型及其他属性
设置转场后的新视图并添加动画到图层

旋转动画
创建动画并定制动画属性
设置动画属性初始值、结束值
设置其他动画属性
添加动画到图层,注意key相当于给动画进行命名,以后获得动画时可以使用此名称

图层动画的本质就是将图层内部的内容转化为位图,经硬件操作形成一种动画效果,其实图层本身没有任何变化,上面的动画中图层并没有因为动画效果而改变他的位置。对于缩放动画其实大小也是不会改变的,所以动画完成后图层还是在原来显示的位置没有任何变化。如果这个图层在一个UIView中你会发现在UIView移动的过程中,你要触发UIView的点击事件也只能点击原来的位置。因为他的位置从来没有改变过

核心动画有一个媒体时间的概念,假设将一个旋转动画设置旋转一周用时60秒的话,那当动画旋转90度后媒体时间就是15秒,如果此时要将动画暂停,只需要让媒体时间偏移设置为15秒即可。并把动画运行速度设置为0使其停止运动。类似的,如果又过了60秒后需要回复动画。这是只要将动画开始时间设置为当前媒体时间75秒减去暂停时的时间。那么动画就会冲