【swift源码阅读】Alamofire-Part2:SessionManager1

Alamofire推荐给开发者的调用层是位于source文件夹下最外层的Alamofire.swift文件,我们先从这里开始。

入口文件目录位置

文件最开始的地方定义了一个URLConvertible的协议,里面只有一个asURL方法,返回一个URL类型。后面可以看到对String,URL和URLComponents都做了URLConvertible的拓展。以下以String类型的拓展为例:

对String类型的URLConvertible拓展

可以看出这个方法只是利用对象自身来生成可用的URL,利用协议这种做法是为了实现多态。

查看文件的属性定义可以看到,下面还有一个URLRequestConvertible协议,定义了一个用来返回URLRequest的asURLRequest函数,由URLRequest实现拓展。这个的目的与URLConvertible一样,就不细说了。

Alamofire.swift中的协议与拓展

在URLRequestConvertible下面还有一个URLRequest的拓展,这里要注意一下。

URLRequest拓展

这个拓展中新定义了一个初始化方法,真正需要注意的是第二个adapt函数,这个函数给予了开发者自己自己配置request的接口。adapter函数接收一个RequestAdapter的对象,RequestAdapter实际上是一个协议,这里就不截图了,RequestAdapter在协议中定义了一个adapter函数,这个函数接收一个URLRequest对象,返回一个URLRequest对象。

当我们想实现自定义的request的时候,传入一个实现了RequestAdapter拓展的对象即可。

接下来就是功能性的函数了,也是使用Alamofire主要调用的函数,但是往下一看,你会发现这些函数全是这种画风:

这里我们终于讲到本文的重点了————SessionManager!

SessionManager是真正的管理者,所有Alamofire的外部调用都是调用SessionManager里的方法。接下里我们看一下SessionManager.swift文件里的内容。

首先SessionManager里面定义了一个静态的default实例,进行了configuration以及headers的一些基本定义。如果想对headers在原有基础上进行一些拓展的话,直接在这个文件里的defaultHTTPHeaders里面添加就可以了。

Alamofire的调用,实际上都是对SessionManager里的default实例的调用。

SessionManager里还有很多其他属性以及初始化方法,这里都暂且不表,其中有一些后面有涉及的时候会讲解,有兴趣的朋友可以去看一下。这里我们直接把目光锁定在实例方法上。SessionManager主要有三套方法:request, download以及upload。


request

根据前一章NSURLSession基础,我们知道,所有的利用URLSession进行网络请求的本质是启动URLSessionTask。所以可以看到所有的方法最后都会走到DataRequest.resume()。request系列函数共有两个公有函数,如下。

request公有函数

可以看出,第一个request方法,实际上是对request(_ urlRequest:URLRequestConvertible)的二次封装,利用调用者传入的参数生成URLRequest后,调用request(_ urlRequest:URLRequestConvertible)。

DataRequest.Requestable是定义在DataRequest中的一个结构体,这个机构体拥有一个URLRequest变量和一个返回URLSessionTask的task函数。

于是我们可以看出,在request(_ urlRequest:URLRequestConvertible)中,先利用传入的参数生成task,再利用这个task生成request,将这个request加入到SessionDelegate中,然后检查startRequestsImmediately变量(默认为true),如果为true,调用request.resume()启动请求。

这里有人可能有疑惑了,既然传入的参数调用asURLRequest方法时就已经返回了一个request,为什么还要用task重新生成一个呢?为什么是由request调用resume函数而不是task呢?

我们先来看一下用task生成request的函数定义,这个函数定义在Request类中,是Alamofire中所有request的总基类。

从上图可以看出,利用这个函数生成的request根据传入的task初始化了taskDelegate。只有这种request加入sessionDelegate才有意义,可以通过sessionDelegate来处理请求的回调。这也是为什么要用task重新生成一个request来加入delegate的原因。

那么为什么用request来调用resume而不是task呢?

实际上request是没有resume函数的,这里的resume是被封装在Request中的自定义函数。

自定义的resume函数

在resume函数中会检查request的task是否被挂起,如果没有就调用task的resume函数。这里比较有意思的是任务开启后会发送一个通知,但你会发现在Alamofire中没有任何地方接收这个通知,这个通知其实是发送给第三方调用者的。如果你有任务开启后要马上执行的动作,你就可以在代码中接收这个通知。在Alamofire的高级使用中我们会讲到这里。

关于Request和SessionDelegate的代码,我们会在以后进行阅读。下一篇将讲解SessionManager中的upload与download方法。

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

推荐阅读更多精彩内容