在开始讲解之前,先明确一点,这篇文章不会告诉大家怎么使用Alamofire,主要是自己将Alamofire解读后的一点感想和分享。文章可能比较粗陋,希望大家不要介意。想要具体研究的伙伴可以看源码地址Alamofire的github地址。
Alamofire简介
使用oc开发的同学,对于AFNetworking这个框架,应该还是很熟悉的,很多app都使用这个框架来进行网络的访问。而Alamofire就是swift的版本的AFNetworking。所以大家很清楚了Alamofire的功能了。
整体框架
Alamofire目录从图中可以看出,整体架构主要分为4部分:
1.Alamofire.swift文件
2.Core文件夹
3.Extension文件夹
4.Features文件夹
1.Alamofire.swift
是整个框架的表现层(供用户调用的API),主要提供的api有request,downoad,upload这三个func。
request支持两种形态:
1).public func request(_ url, method,parameters: ,encoding,headers)
2).public func request(_ urlRequest: ) ,都是返回 DataRequest参数。
download支持三种形态:
1).public func download(_ url,method,parameters,encoding ,headers ,to destination: ),最后一个参数的意思就是制定文件下载后存放的文件。
2).public func download( _ urlRequest,to destination)
3).public func download(resumingWith resumeData, to destination),都是返回DownloadRequest。这个方法实现了文件的断点下载。
upload支持种八形态:
1).public func upload(_ fileURL,to url,method,headers)
2).public func upload(_ fileURL, with urlRequest)
3).public func upload(_ data, to url,method,headers )
4).public func upload(_ data, with urlRequest)
5).public func upload(_ stream,to url,method,headers)
6).public func upload(_ stream, with urlRequest)
7).public func upload(multipartFormData)
8).public func upload(multipartFormData
,usingThreshold encodingMemoryThreshold,with urlRequest: ,encodingCompletion: )
第1和第2都是文件形式上传的,第3和第4以data形式进行上传。第5和第6以stream形式上传。第7和第8支持多种格式的数据类型上传。
2.Core文件夹
是整个框架的业务逻辑层,是整个框架的心脏。整个Core文件夹采用了高度解耦的方式。Request文件是整个框架的运行中心。每个文件的功能跟文件命名一样,各司其职,又互相引用。
Request:
在讲解Request类之前,我们先问自己一些问题。整个网络请求建立的流程,服务器支持的请求类型,每种请求类型需要什么样的配置。和服务器交互的过程会出现哪些情况,每个情况怎么处理。
首先讲解三个Protocol:RequestAdapter,RequestRetrier,TaskConvertible.RequestAdapter主要是实现适配功能,RequetsRetrier实现重新请求的时候需要处理的事情,TaskConvertible在Task的时候需要处理的事情。在Task的时候,会涉及到一个类URLSession的,这里我就不赘述,大家可以参考这篇文章:URLSession。
RequestTask从RequestTask中我们可以看出Request可以实现四种形态的类型。
这里我们还需要了解锁的概念: 锁 是什么意思?
我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁应运而生。
接下来我们来看看init,在这个func里面,主要是根据不同的task类型进行不同的参数配置。
在reuqesut我们会碰到请求暂停,请求恢复,请求取消的情况,所以在Request里面有三个func: func resume, func suspend, func cancel。在Alamofire的Request类中,四种形态的Request被封装成了三个具体实现功能的子类:DataRequest,UploadRequest,DownloadRequest。
1.DataRequest
DataRequest主要涉及到一个Requestable的这个struct主要是负责对task的处理,
func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask。或许很多同学都看不懂,这里给大家介绍一篇文章,看了就知道了大概了:URLSession的讲解。还有就是涉及到stream和downloadProgress的处理。
2.DownloadRequest
讲DownloadRequest,首先给大家讲讲DownloadOptions,这是一个遵循OptionSet协议的strcut,实现了选项集合的功能。
3.UploadRequest
UploadRequest主要讲的是对data,file,stream三种格式的支持,以及上传进度的显示。
Response:
Response主要涉及到request,response,data,result,timelin,value,error这几个参数。具体就不讲解了,还有一个重要的功能就是对返回数据的map处理。
AFError:
AFError是一个枚举类型,采用了Error Protocol。里面涉及到以下几个子枚举。
ParameterEncodingFailureReason: 属性列表在序列化的时候会产错误的情况。
MultipartEncodingFailureReason:编码过程中引起的多种错误。
ResponseValidationFailureReason: 返回数据验证错误。
ResponseSerializationFailureReason :返回值序列化失败。
在AFError的extension的注释中我们可以看到是对Error Booleans的处理。主要是针对以上子枚举类型的处理。
Notification:
Notification主要是对Notification.Name的extension:
DidResume,DidSuspend,DidCancel,DidComplete。
ParameterEncoding:
这里我就不具体展开讲了,具体可以查看这篇文章:ParameterEncoding。
Result:
Result主要是在success和failure的情况下的处理方式。
SessionDelegate,SessionManager,TaskDelegate:
这三块暂时还没有整理处理,后续会用一篇文章详解。
3.Extension文件夹
这个文件夹主要是DispatchQueue+Alamofire文件。
4.Features
MultipartFormData:
这里不具体赘述整个文件,具体的可以查看这篇:MultipartFormData详解,不过大家需要了解几个概念:
1).boundary就是分隔符的意思。MultipartFormData中有三种分隔符,initial、encapsulated、final分别表示开始,内部,结束。不同分隔符会有不同的功能。
2).BodyPart是一个内部类,里面有5个参数:headers,bodyStream,bodyContentLength,hasInitialBoundary,hasFinalBoundary, 每次调用MultipartFormData的append方法,就是生成一个BodyPart然后存储在MultipartFormData的BodyParts数组中。
整个文件的主要作用是通过append实现bodyParts添加BodyPart实例。data或者stream类型的数据encode和write。
NetworkReachabilityManager:
这个文件主要实现的通过Listen(监听)判断网络的情况(unknow,notReachable,Reachable)。
ResponseSerialization:
该文件讲的是先创建DataResponseSerializer和DownloadResponseSerializer两个strcut。在Request里通过extension加入了timeline 属性。后面基本上就是围绕着Request,DataRequest和DownRequest对response的数据处理,包括serialize,serialize String, serialize JSON,serialize PropertyList。
ServerTrustPolicy:
该文件讲的是与server 的trust 策略,包括certificaters提交给server, 验证 server trust是否有效。
TimeLine:
这个文件主要涉及到request StartTime, initialResponseTime, requestCompletedTime, serializationCompletedTime, latency, requestDuration, serialzationDuration, totalDuration几个参数以及格式的处理。
Validation:
该文件主要讲的是对Request的Result Vallid,DataRequest 的Result Valid, DownloadRequest 的 Result Valid。
总结:
总结从总结图中我们可以进行思路梳理:
1.先是要有Request, Request会有哪几种了类型的Request的呢?
2.接下来就是Reuqest请求是怎么建立的呢,这里就会涉及到SessionDeleate, SessionManager,TaskDelegate
3. 要想与服务器交互,那就需要网,那就涉及到了NetworkReachabilityManager了
4.网有了,相当于路有了,那么问题来了,人家服务器总不能什么东西都接收吧,所以需要你需要凭证,这就涉及到了ServerTrustPolicy了。
5.在整个与服务器交互中可能会出现suspend,resume,cancel,complete等status,所以这时候需要Notification。
6.有Request,那就有Response。
7.因为格式的不同,所以需要对返回的值进行处理,所以这里就会涉及到Response Serialization
8.处理完以后,我们就获得了Result,有了Result,我们需要检验成果,所以这里就涉及到了Validtion。
9.在整个交互中,无论是Request,还是Response,都可能会出现错误,都需要实时关注网络的情况,每个环节都需要时间,所以这里就需要AFError,NetworkReachabilityManager,Timeline。
文章比较粗陋,还存在错误,希望大家能多多指出存在的问题。
网友评论