美文网首页
AFNetworking3.0阅读指南

AFNetworking3.0阅读指南

作者: 快乐的小梁同学 | 来源:发表于2016-03-28 10:22 被阅读633次

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取出来 进行序列化并回传给主线程

相关文章

网友评论

      本文标题:AFNetworking3.0阅读指南

      本文链接:https://www.haomeiwen.com/subject/qbejlttx.html