美文网首页
Alamofire解读

Alamofire解读

作者: 售前界的不死小强 | 来源:发表于2017-10-29 11:40 被阅读24次

    在开始讲解之前,先明确一点,这篇文章不会告诉大家怎么使用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。

    文章比较粗陋,还存在错误,希望大家能多多指出存在的问题。

    相关文章

      网友评论

          本文标题:Alamofire解读

          本文链接:https://www.haomeiwen.com/subject/dyespxtx.html