AFNetworking (3.1.0) 源码解析 <一>

首先说一下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/

时间: 2024-10-20 07:31:01

AFNetworking (3.1.0) 源码解析 <一>的相关文章

AFNetworking (3.1.0) 源码解析 &lt;五&gt;

这次主要开始讲解一下文件夹Serialization下的类AFURLRequestSerialization. AFURLRequestSerialization类遵守`AFURLRequestSerialization`和`AFURLResponseSerialization`协议,提供一个查询字符串/表单编码的参数序列化和默认请求头的具体的基本的实现,以及响应状态代码和内容类型验证.也就是对发出的请求进行一些处理. 处理HTTP的任何请求或响应序列化被鼓励归入“AFHTTPRequestSe

AFNetworking (3.1.0) 源码解析 &lt;三&gt;

今天要介绍的是Reachability文件夹下的AFNetworkReachabilityManager类.通过字面意思我们就可以知道AFNetworkReachabilityManager是用来监测网络状态,网络状态管理的类,他可以通过设置状态改变回调来获得当前网络状态. 下面我们还是先看.h文件. 上边枚举表示的是网络状态,网络状态有以上几种,分别是未知,不可用,无线广域网连接,WiFi连接. 以上是包含的属性 networkReachabilityStatus当前网络的状态,就是枚举中的类

Android事件总线(二)EventBus3.0源码解析

相关文章 Android事件总线(一)EventBus3.0用法全解析 前言 上一篇我们讲到了EventBus3.0的用法,这一篇我们来讲一下EventBus3.0的源码以及它的利与弊. 1.构造函数 当我们要调用EventBus的功能时,比如注册或者发送事件,总会调用EventBus.getDefault()来获取EventBus实例: public static EventBus getDefault() { if (defaultInstance == null) { synchroniz

Spring 源码解析之DispatcherServlet源码解析(五)

Spring 源码解析之DispatcherServlet源码解析(五) 前言 本文需要有前四篇文章的基础,才能够清晰易懂,有兴趣可以先看看详细的流程,这篇文章可以说是第一篇文章,也可以说是前四篇文章的的汇总,Spring的整个请求流程都是围绕着DispatcherServlet进行的 类结构图 根据类的结构来说DispatcherServlet本身也是继承了HttpServlet的,所有的请求都是根据这一个Servlet来进行转发的,同时解释了为什么需要在web.xml进行如下配置,因为Spr

EventBus3.0源码解析

本文主要介绍EventBus3.0的源码 EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递. EventBus使用简单,并将事件发布和订阅充分解耦,从而使代码更简洁. 本文主要从以下几个模块来介绍 1.EventBus使用 2.EventBus注册源码解析 3.EventBus事件分发解析 4.EventBus取消注册解析 一.EventBus使用 1.首先是注册 EventBus.getDefault().register(this)

Tomcat请求处理过程(Tomcat源码解析五)

前面已经分析完了Tomcat的启动和关闭过程,本篇就来接着分析一下Tomcat中请求的处理过程. 在开始本文之前,咋们首先来看看一个Http请求处理的过程,一般情况下是浏览器发送http请求->建立Socket连接->通过Socket读取数据->根据http协议解析数据->调用后台服务完成响应,详细的流程图如上图所示,等读者读完本篇,应该就清楚了上图所表达的意思.Tomcat既是一个HttpServer也是一个Servlet 容器,那么这里必然也涉及到如上过程,首先根据HTTP协议

iOS即时通讯之CocoaAsyncSocket源码解析五

接上篇:iOS即时通讯之CocoaAsyncSocket源码解析四         原文 正文待补...

iOS 8:AFNetworking2.0源码解析 1

源地址:http://blog.cnbang.net/tech/2320/ 最近看AFNetworking2的源码,学习这个知名网络框架的实现,顺便梳理写下文章.AFNetworking2的大体架构和思路在这篇文章已经说得挺清楚了,就不再赘述了,只说说实现的细节.AFNetworking的代码还在不断更新中,我看的是AFNetworking2.3.1. 本篇先看看AFURLConnectionOperation,AFURLConnectionOperation继承自NSOperation,是一个

AFNetworking2.0源码解析

写在前面给大家推荐一个不错的网站 点击打开链接 本文测试例子源码下载地址 最近看AFNetworking2的源码,学习这个知名网络框架的实现,顺便梳理写下文章.AFNetworking的代码还在不断更新中,我看的是AFNetworking2.3.1. 本篇先看看AFURLConnectionOperation,AFURLConnectionOperation继承自NSOperation,是一个封装好的任务单元,在这里构建了NSURLConnection,作为NSURLConnection的del