解读Alamofire

在开始介绍之前先明确一点,本篇写的不是关于Alamofire是怎么使用的,而是我仔细看了Alamofire框架代码后的一点感受与大家分享。写的不好也请大家见谅。如果是想要学习怎么使用的话还是建议直接阅读github上面的文档Alamofire documentation从基本到高级都讲解的很详细。

Alamofire

对于使用oc的同学来说一定十分熟悉AFNetworking这个框架,因为现在我们的app只要是有关于网络访问的部分大部分都会通过这个框架来进行网络的访问。而本篇要说的Alamofire就是swift版本的AFNetworking拉。所以Alamofire也是进行网络访问的框架。

整体架构

从github上下载Alamofire用Xcode打开可以看到如下的结构目录:

Alamofire目录

其中主要分为3部分:

  1. Alamofire.swift文件
  2. Core核心部分
  3. Features部分

我主要是分析Core部分的代码,而Features部分的代码我只会分析一部分,因为Features部分的代码是大同小异的只要理解了其中一部分的代码是怎么写的其他的只要在稍稍阅读下就可以了,当然每个部分的代码都有其精彩之处。希望大家有时间也可以自己再去阅读下大家多交流交流😊。

Alamofire.swift分析

在Alamofire.swift文件主要有两个功能:1. 提供了整个框架的入口。2. 向整个框架提供了方便的工具方法。

整个Alamofire.swift文件在内容上面也主要分成了两部分:
第一部分:


接口和convenience

在这一部分中主要是定义了两个Convertible协议和一个Convenience方法
两个个Convertible协议代码如下:

URLStringConvertible

这个协议是规定了其他类转化为URLString的方法从而可以使用这个来构造URLRequest。这么做得目的是将个各类的转化方法和方式分散到个各类中各自实现,就可以避免出现一大坨的转化方法,实现代码的美观。同理在接下来的URLRequestConvertible也是这个道理

URLRequestConvertible

接下来就是工具方法了

URLRequest

这个方法是用来构造NSURLRequest的简便方法,其中有一个参数就是URLStringConvitible类型的。所以如果我们自己的某个类也实现了URLStringConvertible协议也是可以通过这个方法构造NSURLRequest的。在有一个Method类型这个类型是


Method

定义在ParameterEncoding.swift文件中。

接下来就是提供了整个框架的入口方法,这里就先不做介绍等下面的Core部分懂了那么这部分就很自然的懂了

Core部分

在正式介绍整个核心部分之前,必须要有NSURLSession的基础知识,因为整个Alamofire框架其实是对NSURLSession进行封装的。如果对这一方面的只是缺乏还是建议先去补充一下,不然的话你会不知道接下来为什么要这么做。

在3个文件中总共是有Manager类、Request类和ParameterEncoding枚举类型。

Manager类:封装了NSURLSession以及相对应的代理方法
Request类: 封装了NSURLSessionTask以及Task的基本的代理方法
ParameterEncodeing:负责对HTTP请求的参数进行编码

框架总体流程是:


发送流程

这个是发送的流程,我们调用Alamofire.swift里的方法,而Alamofire里的方法其实是创建一个Manager调用Manager里的方法将得到的NSURLSessionTask封装成Request实例,发送并且返回Request实例。

得到回复时候的回调

在消息发送成功了,服务器处理好以后,需要将处理好的回复发送回来那么在发送回来的时候首先是调用了Manager的代理方法,然后在Manager中调用Request类的方法,最后才是掉用response方法和progress方法等。

那么在我们进行网络访问的时候一定不是只是发一个Request这么简单,而是有很多个Request那么在有回调的时候Manager是怎么知道是哪个Request的回调呢?那么接下来这就要求我们知道Manager里面是如果工作的。

Manager

先上Manager的图


Manager

属性:

session: NSURLSession类型发送请求并且得到NSURLSessionTask
delegate: session的代理
queue:实现session线程安全的队列
startRequestsImmediately:是否立刻发送请求
backgroundCompletionHandler:后台运行完成后的回调的closure

现在我们看以下Manager的request方法

request

在两个request方法中其中一request方法是先将参数封装成NSURLRequest在调用另一个重载的request方法,并且在封装成URLRequest的时候还对参数进行了编码。
我们的重点是在request(URLRequest:)这个方法这里。这个方法里面先是得到一个NSURLSessionTask然后将Task封装成Request,并将Request的delegate 存入自己的delegate的里面然后放回。
到这里为止Manager在将URLRequest封装成Request的时候就已经将Request的delegate存放到自己的delegate里面,好在后面的时候可以使用。

接下来就是Manage类里面的重头戏,session的代理。

SessionDelegate

先看SessionDelegate类的属性部分,但在此之前先跟大家提一下这个类是Manager的内部类,而且它的修饰符是final,这就意味着这个类是不可被继承的。那为什么是内部类呢?这里就留给大家好好体会😊
在SessionDelegate类里面有字典subdelegates这个就是在request里面用来存放request的delegate的。而下面的subdelegateQueue则是保证对字典的线程安全。在这里我们还注意到SessionDelegate还实现了subscript下标主要是为了存取方便,也顺便吧线程安全的操作一起写入。

同时,我们也可以注意到SessionDelegate实现了所有NSURLSession应该实现的所有协议NSURLSessionDelegate、NSURLSessionTaskDelegate、NSURLSessionDataDelegate和NSURLSessionDownloadDelegate。那么接下来我们看他是怎么实现的

NSURLSessionDelegate

因为太长了所以我只截取了NSURLSessionDelegate部分。大家可以注意到在这里主要有两大块一块是Override Closures部分,另一块是DelegateMethod部分,而且这两块是相互对应的。那么为什么这么做呢?因为可以让使用者对其中一些方法进行自定义同时也建议大家看看这篇文章更轻量的 View Controllers。每一部分Delegate都是以这种形式写的。所以Alamofire给使用者提供了很大的自定义的空间。

Request

同样的Request类在处理上面也是有内部来处理代理的主要结构入下图所示:


Request

在Request里面有两个代理,分别是TaskDelegate和DataTaskDelegate。同样都是内部类,那么为什么要这么分呢?那是因为NSURLSessionTask是有不同的类型的:

NSURLSessionUploadTask:上传任务类型
NSURLSessionDataTask:请求数据类型
NSURLSessionDownloadTask:下载类任务

而我们平常的GET、POST请求就是属于DataTask类型的。而每种类型的Task都有需要实现的协议UploadTask和DataTake所需要实现的协议是
NSURLSessionDataDelegate而DownloadTask所需要实现的协议是NSURLSessionDownloadDelegate。而不管是哪一种类型的Task都需要实现NSURLSessionTaskDelegate。所以在Request的内部类中TaskDelegate是实现了NSURLSessionTaskDelegate,DataTaskDelegate在继承了TaskDelegate的基础上实现了NSURLSessionDataDelegate。那么Download类型的呢?因为Download在一般的app中比Data出现的概率小,所以不应该出现在核心部分,所以Download是以扩展的形式在Features中Download.swift文件中实现的。
所以Request类的核心部分最主要的就是基础的TaskDelegate类是怎么实现的:

TaskDelegate

在TaskDelegate中我们最主要的是关注两个属性一个是task属性和queue属性。task 属性就是NSURLSessionTask类型,所以在这里我们知道Request吧基础Task封装到Delegate里面而外层的Request只是一个提供方便方法的外套而已。另外一个需要关注的属性queue是一个队列。而且大家注意到在队列初始化的时候吧队列的suspended属性设置为true,说明不希望队列里面的任务立刻执行。那么什么时候执行呢?我们直接跳到Delegate的代理方法

complete

在代理方法didCompleteWithError的时候将queue的suspended属性设置成false就是说明现在立刻运行。所到这里的时候我们就已经可以知道这个queue是存放这Request完成请求以后需要完成的东西。那么这个是什么东西呢?

Example

这个东西就是我们在使用Alamofire的时候所调用的.progress方法和response方法等等。在调用这两个方法的时候会将我们需要执行的代码打包成closure存入queue中等拿到了服务器的回复后在让queue运行存放在里面的closure。

所以到这里为止本篇文章的目的已经达到了。因为篇幅有限不可能面面俱到,只能向大家解释基本的流程。至于Features里面的内容大部分是Manager和Request的扩展。建议大家如果感兴趣的话,还是阅读源码比较好。

如果大家有什么不明白的可以问我,文章写的不好勿喷。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,024评论 4 62
  • 通知的概念 一些基本的概念就不做介绍了,应该都明白,好了,直接上代码为了方便查看,发送通知和接受通知就放在同一个文...
    edison0428阅读 5,942评论 4 15
  • 年会的结束,也曾让我一度以为这也是我在ios系统里的结束,去转战安卓的开端。[流泪] 只可惜,只是因为一不小心多看...
    HEROCJJ阅读 376评论 0 2
  • 语言文字都是人类达意表情的工具:达意达的好,表情表的妙,便是文学。这是胡适在“什么是文学”中的原话。 最近在研究《...
    秋的归来阅读 445评论 0 0
  • 闲聊天,我们应该都有过这样的经历,几个朋友在一起没什么事,就各种聊,各种嗨。但是我从没想过“闲聊天”能够成为一个节...
    语见生活阅读 1,027评论 0 3