1.它沿用了上个版本中的AFSecurityPlocy类,删掉了上个版本的利用NSURLConnectionOperation相关的所有类,于是,这个版本只支持iOS7以及以上版本,代码也相应的精简了不少。AFNetworkReachabilityManager用来查看网络状态2.这次AFN的核心类是AFURLSessionManager,该类的属性:NSURLSession *session;NSOperationQueue *operationQueue;idresponseSerializer;AFSecurityPolicy *securityPolicy;AFNetworkReachabilityManager *reachabilityManager; //可用性指示器 它继承自NSObject 是一个单利 NSArray*tasks;NSArray*dataTasks;NSArray*uploadTasks;NSArray*downloadTasks;
dispatch_queue_t completionQueue;
dispatch_group_t completionGroup;
// iOS7.0 的一个 bug,当创建 后台的 upload task 的时候可能是 nil,这个值为 YES 的时候会尝试重新创建
BOOL attemptsToRecreateUploadTasksForBackgroundSessions;(试图重建上传任务背景会话)
私有属性:
NSURLSessionConfiguration *sessionConfiguration;
NSMutableDictionary *mutableTaskDelegatesKeyedByTaskIdentifier; // 用来存放AFURLSessionManagerDelegate的实例,key是 task的taskIdentifier
NSLock *lock;和一些回掉块
在.m文件里 有一个 static void * AFTaskStateChangedContext = &AFTaskStateChangedContext; 这是一个指向指针的指针,二级指针
这里是为了做 KVO 的时候给 context 赋值,便于区分不同的 context,由于这个AFHTTPRequestSerializerObserverContext的内存地址是在编译的时候就决定了,所以这么声明确实可以保证 context 不同,是个比较讨巧的方式
https://www.zhihu.com/question/35661618
static方法 url_session_manager_create_task_safely(dispatch_block_t block)方法解决了NSURLSessionTask 的 taskIdentifier 在并发的情况下不唯一的bug,苹果在iOS8时解决了这个bug。 这个方法是同步的同步执行方法而已
url_session_manager_creation_queue()方法,返回一个URL session 行成队列,串行.它是一个单例。
url_session_manager_processing_queue()方法返回一个URL session 处理的队列,并行
url_session_manager_completion_group()方法返回一个URL session 完成的 group
在这个类中.m文件里还有一个类 AFURLSessionManagerTaskDelegate它继承自NSObject 这个类主要用于保存上层调用的completionHandler,每一个task都会生成一个delegate,有独立的completionHandler,保存每个task独立的数据
它的核心方法是dataTaskWtih... 方法会先用 url_session_manager_create_task_safely(dispatch_block_t block)同步一下 先解决NSURLSessionTask 的 taskIdentifier 在并发的情况下不唯一的bug dataTask = [self.session dataTaskWithRequest]; self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue]; 然后转向 addDelegateForDataTask:dataTask.... 在这里把completionHandler,uploadProgressBlock,downloadProgressBlock赋值给delegate的属性,并把delegate
存在manager的一个字典的属性里方便获取。然后执行NSURLSession的回调时通过key取出delegate来调用回调方法,把逻辑转向delegate 然后removeDelegateForTask 让delegate移除监听。而 self.taskDidComplete方法失去效果
3.主要类 面向用户类 AFHTTPSessionManager,它继承自AFURLSessionManager 提供了一系列的初始化方法。我们可以直接使用它 也可以继承他 来进行扩展 比如 创建单列 或者是加一层透明层。它的初始化方法 会把 requestSerialize 设为[AFHTTPRequestSerializer serializer],还有两个requestSerializer 是 AFJSONRequestSerializer,AFPropertyListRequestSerializer继承自AFHTTPRequestSerializer;
把responseSerializer 设为[AFJSONResponseSerializer serializer]; 它继承自AFHTTPResponseSerializer 它的兄弟类有 AFXMLParserResponseSerializer(parser解析),,AFXMLDocumentResponseSerializer,AFPropertyListResponseSerializer,AFImageResponseSerializer,AFCompoundResponseSerializer。都是解析response的类。
requestSerializer和responseSerializer是两个独立的作用工具封装类,稍后再作阐述。初始化完成以后。它会调用dataTaskWithHttpMethod...的方法,并用返回的NSURLSessionDataTask来调取resume方法,开始调接口。。dataTaskWithHttpMethod首先会reserializer URLRequest 然后调用父类的dataTaskWithRequest方法。
4.也就是说 AFURLSessionManager是AFN3.0的核心类。它用来发起请求,接受NSURLSession的代理,并通过AFURLResponseSerialization类把响应体 序列化成我们想到的数据结构。子类AFHTTPSessionManager主要作用是通过AFURLRequestSerialization类来对NSURLRequest进行序列化,并通过调用父类的方法来达到发起请求的目的,那么我们来看一下AFURLSessionManager中 是怎么利用NSURLResponseSerialization把响应数据给序列化的:
5.AFURLSessionManagerTaskDelegate 它被写在AFURLSessionManager.m文件中,甚至不被外界所知道,这是一个高内聚的类,那么我们来剖析一下,看看他的作用,和作者对这个类报有什么样的期望:
它有如下属性:
@property (nonatomic, weak) AFURLSessionManager *manager; //用来持有AFURLSessionManager
@property (nonatomic, strong) NSMutableData *mutableData;
@property (nonatomic, strong) NSProgress *uploadProgress;
@property (nonatomic, strong) NSProgress *downloadProgress;
@property (nonatomic, copy) NSURL *downloadFileURL;
///typedef NSURL * (^AFURLSessionDownloadTaskDidFinishDownloadingBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location); 返回一个文件url
@property (nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading;
@property (nonatomic, copy) AFURLSessionTaskProgressBlock uploadProgressBlock;
@property (nonatomic, copy) AFURLSessionTaskProgressBlock downloadProgressBlock;
///(^AFURLSessionTaskCompletionHandler)(NSURLResponse *response, id responseObject, NSError *error);
@property (nonatomic, copy) AFURLSessionTaskCompletionHandler completionHandler;
它主要让AFURLSessionManager 中NSURLSession的。请求完成的回调,下载完成的回掉,完成重定向的回掉这三个代理 在它的类里进行回调。。。
请求完成的回调里 如果成功了。就用manager.responseSerialiezer把task的response取出来 进行序列化并回传给主线程
网友评论