Alamofire4.x开源代码分析(一)使用方法

Stella981
• 阅读 687

Alamofire4.x开源代码分析(一)使用方法 本着了解框架的实现思路和学习Swift的目的开启本系列的博客.本系列参考Alamofire官方文档和自己的一些理解,欢迎指正和指教.

配置要求

  • iOS 8.0+, macOS 10.10.0+, tvOS 9.0+ and watchOS 2.0+
  • Xcode 8.1+
  • Swift 3.0+

简单使用

Alamofire.request("https://httpbin.org/get").responseJSON { response in
            print("Request: \(String(describing: response.request))")   // // 原始的请求

            print("Response: \(String(describing: response.response))") // http 请求响应
            print("Result: \(response.result)")                         // 响应结果标识
            
            if let json = response.result.value {
                print("JSON: \(json)") // JSON序列化的数据
            }
            
            if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
                print("Data: \(utf8Text)") // 经过UTF-8编码的数据
            }
        }

不难看出alamofire用了链式编程的思想.

响应数据类型

请求返回五种response

 // Response Handler -直接返回URL session delegate的数据
         func response(
         queue: DispatchQueue?,
         completionHandler: @escaping (DefaultDataResponse) -> Void)
         -> Self
         
         // Response Data Handler - 序列化为Data
         func responseData(
         queue: DispatchQueue?,
         completionHandler: @escaping (DataResponse<Data>) -> Void)
         -> Self
         
         // Response String Handler - 序列化成String字符串
         func responseString(
         queue: DispatchQueue?,
         encoding: String.Encoding?,
         completionHandler: @escaping (DataResponse<String>) -> Void)
         -> Self
         
         // Response JSON Handler - 序列化成JSON
         func responseJSON(
         queue: DispatchQueue?,
         completionHandler: @escaping (DataResponse<Any>) -> Void)
         -> Self
         
         // Response PropertyList (plist) Handler - 序列化成plist
         func responsePropertyList(
         queue: DispatchQueue?,
         completionHandler: @escaping (DataResponse<Any>) -> Void))
         -> Self

被序列化的数据可以用通过resonse中的result.value来获取数据

 //也可以同时使用,内部通过线程队列实现
        Alamofire.request("https://httpbin.org/get")
            .responseString { response in
                print("Response String: \(response.result.value)")
            }
            .responseJSON { response in
                print("Response JSON: \(response.result.value)")
        }

Response是默认在主线程队列执行异步回调,

(queue ?? DispatchQueue.main).async

这里的队列也是可以自定义的, 例如:

let utilityQueue = DispatchQueue.global(qos: .utility)

Alamofire.request("https://httpbin.org/get").responseJSON(queue: utilityQueue) { response in
    print("Executing response handler on utility queue")
}

响应验证

validate可以在结果返回之前验证响应状态或类型是否正确,也可以使用默认方式验证.validate()

Alamofire.request("https://httpbin.org/get")
    .validate(statusCode: 200..<300)
    .validate(contentType: ["application/json"])
    .responseData { response in
        switch response.result {
        case .success:
            print("Validation Successful")
        case .failure(let error):
            print(error)
        }
    }

Response缓存

Response缓存基于系统的URLCache,如果需要自定义参数在后面 Session Manager Configurations章节中会讲到

系列目录

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Fiddle设置iphone抓包
_注意:保证手机和电脑在一个网络上_一,设置Fiddler!输入图片说明(https://static.oschina.net/uploads/img/201707/27100350_ckfa.png"在这里输入图片标题")!输入图片说明(https://static.oschina.net/uploads/img/201707
Stella981 Stella981
3年前
Intellij idea或者Android Studio实用Live_Templates好用模板整理
Live\_Templates的作用是自动补全代码:自定义补全代码:单例模式:sin!输入图片说明(https://static.oschina.net/uploads/img/201707/17114328_kR84.png"在这里输入图片标题")Templatetext:privatestatic
Wesley13 Wesley13
3年前
#H5#WebStorm的警告
!输入图片说明(https://static.oschina.net/uploads/img/201611/05163209_Lj0x.png"在这里输入图片标题")今天写了个小时的HTML代码,WS提示forminputwithoutanassociatedlabelortitleattribute,然后搜索了下看到百度知道的一个
Stella981 Stella981
3年前
Spring Boot企业微信点餐系统
!输入图片说明(https://static.oschina.net/uploads/img/201802/07125032_z8w9.jpg"在这里输入图片标题")SpringBoot企业微信点餐系统第1章课程介绍包括项演示、课程概述、课程安排、学习前提等的介绍,让同学们了解这课程第2章项目设计包括需求分析,项⽬目设计,项⽬目
Stella981 Stella981
3年前
Canvas
Canvas04柱状图!输入图片说明(https://static.oschina.net/uploads/img/201707/04223024_wxwr.png"在这里输入图片标题")代码如下:<!DOCTYPEhtml<htmllang"zhCN"<head<metacharset"UTF8"<met
Wesley13 Wesley13
3年前
PHP中的依赖注入(DI)容器
!输入图片说明(https://static.oschina.net/uploads/img/201806/03164821_lowC.png"在这里输入图片标题")介绍我们已经介绍过了PHP反射API(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fphpcast
Easter79 Easter79
3年前
SpringMVC vs Struts2
SpringMVCvsStruts2S性能!输入图片说明(https://static.oschina.net/uploads/img/201703/27180357_LUj5.png"在这里输入图片标题")MVC框架性能比较几篇文章:Link(https://www.oschina.net/action/GoT
Stella981 Stella981
3年前
Elasticsearch学习总结八 ElasticSearch中的聚合操作
首先准备数据,索引包含四个字段fieldA,fieldB,fieldC,fieldD,如下图,以下案列中都使用了基本REST命令和JavaAP两种方式实现!输入图片说明(https://static.oschina.net/uploads/img/201706/15212621_M2dc.png"在这里输入图片标题")1).首先按照某
Wesley13 Wesley13
3年前
PHP 与 GO
PHP!输入图片说明(https://static.oschina.net/uploads/img/201608/22112754_GEtW.png"在这里输入图片标题")输出json!输入图片说明(https://static.oschina.net/uploads/img/201608/22112825_n
Stella981 Stella981
3年前
Delivery Pipeline
deliverypipeline!输入图片说明(https://static.oschina.net/uploads/img/201702/04110334_cl3u.png"在这里输入图片标题")下面这个是netflix的部署流程:!输入图片说明(https://static.oschina.net/uploads/img/2017