9th,August,2016
概述
github地址
Github是这样介绍的:A delightful networking framework for iOS, OS X, watchOS, and tvOS。也就是说这是一款非常友好的第三方库,且适用于iOS,OS X,watchOS和tvOS平台。模块化结构,丰富的API,一款非常优秀的网络。
AFNetworking3.x的认识: 就是基于NSURLSession进行高度封装,给开发者提供更为友好的接口。
查看资料发现AFNetworking2.0与3.0区别还是蛮大的,iOS9.0中已经弃用NSURLConnection。因而AFNetworking3.0中没有对NSURLConnection的支持,而是基于NSURLSession进行封装。(ps: AFNetworking2.0则是基于NSURLConnection与NSOperation开发) 如果需从AFNetworking2.0迁移到3.0可以查看Github:AFNetworking 3.0 Migration Guide
1. AFHTTPSessionManager // 基于HTTP协议的会话管理器,继承AFURLSessionManager
2. AFNetworking
3. AFNetworkReachabilityManager // 网络可达性
4. AFSecurityPolicy // 安全性
5. AFURLRequestSerialization // 请求数据序列化
6. AFURLResponseSerialization // 响应数据序列化
7. AFURLSessionManager// 会话管理器,核心类
架构理解
from Draveness
苹果原生网络解决方案
在分析AFNetworking之前,先总结下苹果原生的网络解决方案。2003年跟着Safari一起推出的网络API:NSURLConnection,之后苹果重构了NSURLConnection,在2013年iOS7引入NSURLSession取代NSURLConnection,2015年iOS9弃用NSURLConnection。
NSURLConnection
从2003年开始,这套使用了十来年的API,虽然因代码简洁性一直被诟病。但在可扩展性与可组合性等方面表现的还是非常优秀的。NSURLConnection不单单只NSURLConnection这个组件,而是指一套构成URL加载系统的相互关联的组件:NSURLConnection,NSURLRequest,NSURLResponse,NSURLProtocol,NSURLCache,NSHTTPCookieStorage,NSURLCredentialStorage(证书存储)。
NSURLSession
同NSURLConnection,NSURLSession也是一组相互关联的组件:除了大部分与NSURLConnection相同的组件。NSURLSession类也是做了比较大的调整。NSURLConnection被调整为由NSURLSession,NSURLSessionConfiguration,以及NSURLSessionTask系列(包括NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask以及iOS9推出的NSURLStreamTask)。
缓存策略
cachePolicy:
1、NSURLRequestUseProtocolCachePolicy 协议缓存,根据 response 中的 Cache-Control 字段判断缓存是否有效,如果缓存有效则使用缓存数据否则重新从服务器请求
2、NSURLRequestReloadIgnoringLocalCacheData 不使用缓存,直接请求新数据
3、NSURLRequestReloadIgnoringCacheData 等同于 NSURLRequestReloadIgnoringLocalCacheData
4、NSURLRequestReturnCacheDataElseLoad 直接使用缓存数据不管是否有效,没有缓存则重新请求
5、NSURLRequestReturnCacheDataDontLoad 直接使用缓存数据不管是否有效,没有缓存数据则失败
会话
NSURLSession 支持进程三种会话:
1、defaultSessionConfiguration:进程内会话(默认会话),用硬盘来缓存数据。
2、ephemeralSessionConfiguration:临时的进程内会话(内存),不会将 cookie、缓存储存到本地,只会放到内存中,当应用程序退出后数据也会消。
3、backgroundSessionConfiguration:后台会话,相比默认会话,该会话会在后台开启一个线程进行网络数据处理。
对比
苹果重构后的NSURLSession对开发者还是相对友好,也很简洁。如果没有特别依赖第三方库(AFNetworking)提供的功能,出于不需要依赖任何第三方库的考虑(依赖第三方库的成本还是有的),推荐使用原生API。
开始看源码啦
AFHTTPSessionManager
[[AFHTTPSessionManager alloc] initWithBaseURL:[[NSURL alloc] initWithString: TEST_URL]]
先看看调用栈,
// 从Draveness的github源码分析复制过来的
- [AFHTTPSessionManager initWithBaseURL:]
- [AFHTTPSessionManager initWithBaseURL:sessionConfiguration:]
- [AFURLSessionManager initWithSessionConfiguration:]
- [NSURLSession sessionWithConfiguration:delegate:delegateQueue:]
- [AFJSONResponseSerializer serializer] // 负责序列化响应
- [AFSecurityPolicy defaultPolicy] // 负责身份认证
- [AFNetworkReachabilityManager sharedManager] // 查看网络连接情况
- [AFHTTPRequestSerializer serializer] // 负责序列化请求
- [AFJSONResponseSerializer serializer] // 负责序列化响应
初始化都做了哪些工作:
1. session会话配置初始化 // AFHTTPSessionManager
2. 序列化响应初始化 // AFRequestSerializer
3. 身份认证初始化,保证安全性 // AFSecurityPolicy