首先说一下AFNetworking的github地址:GitHub - AFNetworking/AFNetworking: A delightful networking framework for iOS
最近抓时间研究了一下AFNetworking,目前版本是3.1.0,我通过CocoaPods导入的AFNetworking,导入后目录如下
使用CocoaPods导入后可以看到目录很清晰主要是在五个文件夹下,NSURLSession,ReachAbility,Security,Serialization和UIKit。当不使用CocoaPods的时候会显示两个文件夹
很明显第一个文件夹里边是跟网络请求相关的,第二个是跟UI相关的。我主要看了一下与网络请求相关的类。
下面就按照CocoaPods导入显示出来文件夹顺序进行介绍
这里我先讲AFURLSessionManager
这个类,主要提供了数据的请求、上传和下载功能
在.h中注释中介绍AFURLSessionManager创建并且管理一个NSURLSession对象,这个对象是基于一个规定的NSURLSessionConfiguration对象,遵循协<NSURLSessionTaskDelegate>, <NSURLSessionDataDelegate>, <NSURLSessionDownloadDelegate>, and <NSURLSessionDelegate>.
下面先将一下当中的属性
session就是要管理的NSURLSession对象,operationQueue是操作队列,当代理回调的时候运行
通过这四个属性,我们分别可以拿到总的任务集合(包括上传和下载任务)、数据任务集合、上传任务集合和下载任务集合
如上图所示,注释里面写到,在iOS7中存在一个bug,在创建后台上传任务时,有时候会返回nil。作为一个修补方案,如果设置这个属性为YES, AFNetworking将会遵照苹果的建议,在创建失败的时候,会重新尝试创建,次数默认为3次。所以你的应用如果有在后台上传的情况的话,记得将该值设为YES,避免出现上传失败的问题。
下面是好多方法,由于方法太多就不一一进行介绍了,可以参考方法上边的注释。
之后我们可以看到很多常量,这些是通知的key。
可以看到定义常量都是用的FOUNDATION_EXPORT,通过观看iOS开发的一些奇巧淫技3这篇文章可以知道FOUNDATION_EXPORT
在c文件编译下是和extern等同,在c++文件编译下是和extern “C”等同,在32位机的环境下又是另外编译情况,在兼容性方面,FOUNDATION_EXPORT
做的会更好。
在.m文件中定义是这样的常量是这样的
到这里.h文件讲解完
下面介绍一下实现文件,先讲几个在AF中的开发技巧
1.为保证线程安全,所有单例都用dispatch_once生成,保证只执行一次,代码如下
2.我们经常看到一个 block 要使用 self,会处理成在外部声明一个 weak 变量指向 self,在 block 里又声明一个 strong 变量指向 weakSelf:
weakSelf是为了block不持有self,避免循环引用,而再声明一个strongSelf是因为一旦进入block执行,就不允许self在这个执行过程中释放。block执行完后这个strongSelf会自动释放,没有循环引用问题。
3.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu"
代码中间有 ?:
#pragma clang diagnostic pop
消除警告,上一篇中有介绍http://www.cnblogs.com/qiutangfengmian/p/5644133.html
下面讲一下代码
我们可以看到在外部API调用dataTask、uploadTask、downloadTask方法实际上都是completionHanlder block返回出来的,但是我们知道网络请求是delegate返回结果的,AF内部做了巧妙的操作,他对每个task都增加代理设置
在设置里面,每个task会在内部创建AFURLSessionManagerTaskDelegate
对象,并设置completionHandler、uploadProgressBlock、downloadProgressBlock回调
然后delegate对象利用kvo将task对一些方法进行监听,并且监听到变化时,通过block返回,将delegate转成block出去
如有转载,请注明出处。
参考资料:
http://zeeyang.com/2016/02/21/AFNetWorking-one/