AFURLSessionManager
发起请求的核心类。通过 AFURLSessionManager 来创建并定制一个request。
主要的成员类
一个Manager里持有着一些负责具体功能的类。
- NSURLSession
- NSOperationQueue
- AFURLResponseSerialization
- AFSecurityPolicy
- AFNetworkReachabilityManager
- 存储不同类型的Session Task的容器,比如
tasks,dataTasks,uploadTasks,downloadTasks
NSURLSession
1 | @property (readonly, nonatomic, strong) NSURLSession *session; |
苹果目前主要的类。新版AF是基于NSURLSession重新实现的。一个manager持有着一个NSURLSession的实例
NSOperationQueue
1 | @property (readonly, nonatomic, strong) NSOperationQueue *operationQueue; |
创建代码
1 | self.operationQueue = [[NSOperationQueue alloc] init]; |
session所有的请求调用delegate, 都是在这个operationQueue上,并通过设置并发数量为1,保证回调执行的次序
AFURLResponseSerialization
1 | @property (nonatomic, strong) id <AFURLResponseSerialization> responseSerializer; |
该协议定义了一个方法,负责将收到的HttpResponse转化为需要的对象。
1 | - (nullable id)responseObjectForResponse:(nullable NSURLResponse *)response data:(nullable NSData *)data error:(NSError * _Nullable __autoreleasing *)error NS_SWIFT_NOTHROW; |
基于这个协议,AF里定制了多种不同的类型的responseSerializer,包括AFHTTPResponseSerializer, AFJSONResponseSerializer, AFXMLParserResponseSerializer, AFXMLDocumentResponseSerializer, AFPropertyListResponseSerializer, AFImageResponseSerializer, AFCompoundResponseSerializer。 其中AFHTTPResponseSerializer 是其他各种responseSerializer类的基类。
AFHTTPResponseSerializer
可以通过acceptableStatusCodes和acceptableContentTypes来对处理的Response进行检查,如果statusCode和MIME type符合两个两个成员变量里定义的类型,就可以正常处理,否则返回处理类型不匹配的Error。 处理的方式是将Response中的Data直接返回,不做加工。acceptableContentTypes默认为nil, 而acceptableStatusCodes默认为200-299
AFJSONResponseSerializer
该类继承自AFHTTPResponseSerializer,因此也会根据statuscode和MIME type来对可以处理的Response进行检查。可以处理的MIME type默认为application/json, text/json, text/javascript。如果可以处理,就会将受到的Data转化为一个json对象。可以通过readingOptions成员变量来设置转化时的option。
AFXMLParserResponseSerializer
该类同样继承自AFHTTPResponseSerializer,可以处理的MIME type默认为application/xml, text/xml。返回的是一个NSXMLParser对象
AFXMLDocumentResponseSerializer
可以处理的MIME type默认为application/xml, text/xml。返回一个NSXMLDocument对象
AFPropertyListResponseSerializer
可以处理的MIME type默认为application/x-plist。返回一个NSPropertyListSerialization对象
AFImageResponseSerializer
可以处理的MIME type默认为 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。注意这个类可以通过设置automaticallyInflatesResponseImage来允许在后台线程中就将收到的Data进行解压缩(下载的网络图片一般是jpg,png等压缩格式),变成位图数据。这样在UI线程中使用图片数据时就可以直接用,从而提高UI线程渲染效率。
AFCompoundResponseSerializer
复合型ResponseSerializer, 支持通过Array类型的responseSerializers来设置一系列ResponseSerializer实例。收到Response时遍历该Array,哪个能处理就用那个。
AFSecurityPolicy
这个类主要是在收到didReceiveChallenge回调时, 配合处理证书有关的逻辑使用。没有细研究
AFNetworkReachabilityManager
负责监听网络连接状态的类。使用的是系统库里的模块SCNetworkReachability。通过这个类让manager也可以进行网络状态监测
mutableTaskDelegatesKeyedByTaskIdentifier成员变量。
一个NSMutableDictionary类型的成员变量,manager为每个创建的task,对应生成一个AFURLSessionManagerTaskDelegate类。这个字典存储每个delegate类。key为task.taskIdentifier, value为delegate类。 当manager收到delegate回调时,先根据task.taskIdentifier从这个字典中查询到对应的AFURLSessionManagerTaskDelegate实例,然后再将收到的调用转发到这个实例中进行具体处理,并在适当时机,调用使用者传入的block回调, 以及发送相应的Notification。
AFURLSessionManagerTaskDelegate
响应每个task的回调,处理process, 以及根据ResponseSerializer来解析数据。
manager
1 | @property (nonatomic, weak) AFURLSessionManager *manager; |
weak类型,对创建task的manager的弱引用。需要通过manager来访问ResponseSerializer等。
mutableData
1 | @property (nonatomic, strong) NSMutableData *mutableData; |
存储收到的数据
AFHttpSessionManager
继承于AFURLSessionManager,封装一系列的GET,POST等常用http请求方法。包含一个AFHTTPRequestSerializer的成员实例
AFHTTPRequestSerializer
该类以及他的子类,负责对常用的请求设置及参数进行辅助组装,产生一个Request。比如query参数拼接,urlencode, http header fields, authorization information,
超时时间,缓存设置等。
UIKit+AFNetworking
在AFNetWorking功能基础上,对UIKit进行扩展
调用时序图
发起一个请求

通过Delegate类处理一个请求
