Kevinlma的博客

物来顺应,未来不迎,当时不杂,既过不恋

0%

AFNetworking学习

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
2
3
self.operationQueue = [[NSOperationQueue alloc] init];
self.operationQueue.maxConcurrentOperationCount = 1;
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];

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

可以通过acceptableStatusCodesacceptableContentTypes来对处理的Response进行检查,如果statusCodeMIME type符合两个两个成员变量里定义的类型,就可以正常处理,否则返回处理类型不匹配的Error。 处理的方式是将Response中的Data直接返回,不做加工。
acceptableContentTypes默认为nil, 而acceptableStatusCodes默认为200-299

AFJSONResponseSerializer

该类继承自AFHTTPResponseSerializer,因此也会根据statuscodeMIME 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类处理一个请求