AFURLSessionManager
AFURLSessionManager是AFNetworking这个框架的基类。负责创建并维护管理NSURLSession对象。AFNetworking在2.0版本中,使用的是NSURLConnection, 到了3.0版本以后,就从了Apple,废弃掉了NSURLConnection,用上了NSURLSession。NSURLConnection和NSURLSession的区别为:
| 类 | NSURLConnection | NSURLSession |
|---|---|---|
| 组成 | NSURLRequest, NSURLResponse, NSURLProtol, NSURLCache, NSHTTPCookiestorage, NSULCredentialStorage, NSRULConnection |
NSURLRequest, NSURLCache, NSURLSession, NSURLSessionConfiguration, NSURLSessionTask |
| 配置信息 | 共享cookie等信息 | 可以配置每个session的缓存,协议,cookie以及证书策略,还可以跨程序共享这些信息 |
| 数据加载 | NSURLConnection |
NSURLSessionTask, 有三种类型的实体子类: NSURLSessionDataTask, NSURLSessionUploadTask和NSURLSessionDownloadTask,所有的task共享创造者NSURLSession |
| 开始方式 | 一旦调用了sendAsynchronousRequest:queue:completionHandler:或者是sendSynchronousRequest:returninigResponse:error:就会立即执行任务 |
创建task后会将task对象返回,允许你进一步配置之后再调用resume方法来运行task |
| 传输字节的参数类型 | long long |
int64_t |
| 文件下载 | 下载在内存缓存 | 在临时文件夹 |
AFURLSessionManager创建了NSURLSession的实例对象,并且遵循<NSURLSessionTaskDelegate>, <NSURLSessionDataDelegate>, <NSURLSessionDownloadDelegate>和<NSURLSessionDelegate>这四个协议。
如果有需要在子类中重写协议的方法的话,必须在实现中首先调用super的实现。而且AFURLSessionManager基本上将delegate的实现变成了直观的block方法调用。除此之外,当任务完成或者被挂起等操作时,都会有相应的Notification发送出来.
在这个基类中,实现了session对象的创建以及三种类型任务的对象创建。
在创建任务的函数中,跟进度相关的block方法的执行都是在session的队列中,而不是在主队列中来更新任务进度。
在这个类中,使用了_AFURLSessionTaskSwizzling来使用runtime机制,对NSURLSessionTask的state机制进行kvo检测。需要使用runtime是因为NSURLSessionTask实际上是一个类簇,并且在iOS 7及iOS 8+中的表示并不相同。
AFHTTPSessionManager
AFHTTPSessionManager继承自AFURLSessionManager,提供了一个单例对象。通常在使用中,我们不会直接使用AFURLSessionManager, 而是继承AFHTTPSessionManager类来编写自己的网络层。这种做法基本能满足大部分需求。
AFNetworkReachabilityManager
这个类主要用于监测网络状态,使用之前,需要调用startMonitoring方法开启监测后才能获取到网络状态。
- 状态
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
// 未知的主机地址
AFNetworkReachabilityStatusUnknown = -1,
// 主机地址无法访问
AFNetworkReachabilityStatusNotReachable = 0,
// 通过移动网络可达 AFNetworkReachabilityStatusReachableViaWWAN = 1,
// 通过无线网络可达
AFNetworkReachabilityStatusReachableViaWiFi = 2,
};
-
对于网络监测的代码,可以参考苹果提供的样例:developer.apple.com/library/ios…
-
AFNetworkReachabilityManager可以监测当前网络的可达性,也可以获取到指定地址(域名或者ip地址)的可达性
+ (instancetype)manager;
+ (instancetype)managerForDomain:(NSString * )domain;
+ (instancetype)managerForAddress:(const void *)address;
- ·在监测时,使用的
SystemConfiguration这个系统框架提供的SCNetworkReachability提供的方法,将状态监测放到了main runloop的common mode中。在后台队列中,如果网络状态发生变化的话,会通过AFPostReachabilityStatusChange方法将变化添加到主线程上
AFSecurityPolicy
网络安全相关
AFURLRequestSerialization
将请求序列化,将参数转换为query string/entity body,并允许我们设置header信息
-
AFPercentEscapedStringFromString(NSString *string)用于将字符串编码,根据RFC 3986的标准,对传入的字符串进行编码后返回 -
对于header信息的修改,是在一个并发队列中执行的,当需要设置header的field时,会使用GCD的
dispatch_barrier_async来设置barrier,直到field设置完成。
AFURLResponseSerialization
将服务器返回的数据转换为有用的形式(类型)
对于不同类型的content-type都会有相对应类型的序列化操作:
// Base class
AFHTTPResponseSerializer
/**
- 'application/json'
- 'text/json'
- 'text/javascript'
*/
AFJSONResponseSerializer
/**
将XML响应解码为'NSXMLParser'对象
- 'application/xml'
- 'text/xml'
*/
AFXMLParserResponseSerializer
/**
将XML响应解码为'NSXMLDocument'对象
- 'application/xml'
- 'text/xml'
*/
AFXMLDocumentResponseSerializer
/**
- 'application/x-plist'
*/
AFPropertyListResponseSerializer
/**
- 'image/tiff'
- 'image/jpeg'
- 'image/gif'
- 'image/png'
- 'image/ico'
- 'image/x-icon'
- 'image/bmp'
- 'image/x-bmp'
- 'image/x-xbitmap'
- 'image/x-win-bitmap'
*/
AFImageResponseSerializer
关于AFNetworking2.0的,可以参考以下两篇文章: