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进行扩展