文档章节

Alamofire4.x开源代码分析(五)进阶用法

她吃西红柿
 她吃西红柿
发布于 2017/07/10 16:53
字数 932
阅读 43
收藏 0
点赞 0
评论 0

Alamofire基于URLSession和Foundation URL的加载机制,为了更充分的了解和使用本框架,建议大家深刻的学习底层的网络实现.

建议阅读

Session Manager

Alamofire.request就是我们最外层的方法方法,内部通过Alamofire.SessionManager和默认的URLSessionConfiguration实现
下面两者是等价的

Alamofire.request("https://httpbin.org/get") 
let sessionManager = Alamofire.SessionManager.default
sessionManager.request("https://httpbin.org/get")

通过URLSessionConfiguration我们可以自由的修改http请求头,超时时间等.应用程序可以未后台和临时会话创建管理器

Creating a Session Manager with Default Configuration

let configuration = URLSessionConfiguration.default
let sessionManager = Alamofire.SessionManager(configuration: configuration)

Creating a Session Manager with Background Configuration

let configuration = URLSessionConfiguration.background(withIdentifier: "com.example.app.background")
let sessionManager = Alamofire.SessionManager(configuration: configuration)

Creating a Session Manager with Ephemeral Configuration

let configuration = URLSessionConfiguration.ephemeral
let sessionManager = Alamofire.SessionManager(configuration: configuration)

自定义Session Configuration

var defaultHeaders = Alamofire.SessionManager.defaultHTTPHeaders
defaultHeaders["DNT"] = "1 (Do Not Track Enabled)"

let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = defaultHeaders

let sessionManager = Alamofire.SessionManager(configuration: configuration)

对于Authorization和Content-Type,不建议通过configuration来修改,Alamofire.request API提供的header来配置.

Session Delegate

默认情况下,Alamofire SessionManager会创建一个SessionDelegate对象来处理URLSession生成的所有各种回调,从中抽出最简单的实现方法. 对于特定需求的开发者,需要覆盖这些方法. ####重写闭包 第一种自定义SessionDelegate方法是重写闭包,每个闭包都对应着SessionDelegate的实现. 举例

/// Overrides default behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)`.
open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?

/// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`.
open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)?

/// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)`.
open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> URLRequest?)?

/// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)`.
open var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)?

以下是如何使用taskWillPerformHTTPRedirection避免重定向到任何apple.com的问题

let sessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.default)
let delegate: Alamofire.SessionDelegate = sessionManager.delegate

delegate.taskWillPerformHTTPRedirection = { session, task, response, request in
    var finalRequest = request

    if
        let originalRequest = task.originalRequest,
        let urlString = originalRequest.url?.urlString,
        urlString.contains("apple.com")
    {
        finalRequest = originalRequest
    }

    return finalRequest
}

###子类覆盖父类方法 另一种方法就是通过子类来重写父类方法

class LoggingSessionDelegate: SessionDelegate {
    override func urlSession(
        _ session: URLSession,
        task: URLSessionTask,
        willPerformHTTPRedirection response: HTTPURLResponse,
        newRequest request: URLRequest,
        completionHandler: @escaping (URLRequest?) -> Void)
    {
        print("URLSession will perform HTTP redirection to request: \(request)")

        super.urlSession(
            session,
            task: task,
            willPerformHTTPRedirection: response,
            newRequest: request,
            completionHandler: completionHandler
        )
    }
}

####Request request,download, upload stream这四个方法的返回值分别为DataRequest, DownloadRequest, UploadRequest StreamRequest,并且他们都继承自Request.每个子类都有专用的方法,如authenticate,validate,responseJSON和uploadProgress,都会返回调用者的实例,方便使用. Request可以被暂停,恢复,取消:

  • suspend() 暂停
  • resume() 恢复, 在SessionManager中有一个属性:startRequestsImmediately。他控制这请求是不是立刻发起,默认的值为true。
  • cancel() 取消 同时该请求的每一个监听对象都会受到一个错误回调

####Routing Requests 随着应用程序的扩展,在构建网络堆栈时,采用通用模式很重要. 该设计的重要部分是如何路由您的请求. Alamofire URLConvertible和URLRequestConvertible协议以及路由器设计模式就是为之设计的. 路由的概念就是中转站的意思,在Alamofire中,String, URL, URLComponents实现了URLConvertible协议.

let urlString = "https://httpbin.org/post"
Alamofire.request(urlString, method: .post)

let url = URL(string: urlString)!
Alamofire.request(url, method: .post)

let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true)!
Alamofire.request(urlComponents, method: .post)

采用URLConvertible协议的类型可用于构造URL,然后用于内部构造URL请求。 默认情况下,string,URL和URLComponent准守URLConvertible协议,允许将任何一个作为URL参数传递发送请求,上传和下载等方法:

let urlString = "https://httpbin.org/post"
Alamofire.request(urlString, method: .post)

let url = URL(string: urlString)!
Alamofire.request(url, method: .post)

let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true)!
Alamofire.request(urlComponents, method: .post)

遵守URLConvertible协议,可以方便我们便捷的使用model与服务器生成映射关系.

extension User: URLConvertible {
    static let baseURLString = "https://example.com"

    func asURL() throws -> URL {
    	let urlString = User.baseURLString + "/users/\(username)/"
        return try urlString.asURL()
    }
}
let user = User(username: "mattt")
Alamofire.request(user) // https://example.com/users/mattt

© 著作权归作者所有

共有 人打赏支持
她吃西红柿
粉丝 32
博文 44
码字总数 21703
作品 0
杭州
iOS工程师
iOS AutoLayout进阶(一)Aspect Ratio

前言 AutoLayout相信大家都不陌生,iOS开发中涉及到UI布局的地方,都有它的身影,基本用法很多同学都会,本文就不做介绍,下面就AutoLayout一些进阶高级用法,做详细介绍,掌握好这些技巧,iOS开发将...

朱晓辉 ⋅ 2017/11/19 ⋅ 0

一道java面试题分析及思考

转载请注明原创出处,谢谢! 无意中了解到如下面试题目,觉得蛮好,但是没有分析,所以自己拿来分析了下,以及自己的一些思考理解。 题目如下: 该程序的输出结果? 程序输出结果 考察知识点...

匠心零度 ⋅ 2017/11/01 ⋅ 0

史上最难的一道Java面试题 (分析篇)

简书 匠心零度 转载请注明原创出处,谢谢! 无意中了解到如下题目,觉得蛮好。 题目如下: 该程序的输出结果? 程序输出结果 考察知识点 synchronize实例锁。 并发下的内存可见性。 在java中...

匠心零度 ⋅ 2017/10/15 ⋅ 0

iOS AutoLayout进阶(五)UITableViewCell自动高度

前言 前面几个章节详细介绍了Aspect Ratio、Content Hugging Priority(抗拉伸优先级)和Content Compression Resistance Priority(抗压缩优先级), 本文将综合运用这些特性,在不计算UITableVi...

朱晓辉 ⋅ 2017/11/27 ⋅ 0

《Linux云计算从入门到精通》系列实战笔记全放送

为了方便Linux云计算爱好者的学习查看,马哥Linx云计算团队特别整理了《Linux云计算从入门到精通》年度重磅大放送,囊括了整个学习过程的学习精华,内容全部由马哥Linux云计算学员撰写,欢迎...

898009427 ⋅ 2017/11/21 ⋅ 0

Python爬虫学习系列教程

一、Python入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库的高级用法 5. Python爬虫入门五之U...

xiejunbo ⋅ 2016/02/16 ⋅ 0

掘金技术征文 | 【我与那些开发库 / 框架的爱恨情仇】评选结果

历时半个多月,第一期掘金技术征文主题活动终于落下了帷幕。短短半个月的时间里,我们也和大家一起,见证了掘金上各位开发者的技术实力,也感受到了掘金上浓厚的技术氛围,更接触到了开发们技...

稀土君 ⋅ 2017/01/04 ⋅ 0

Python数据分析学习路径图(120天Get新技能)

Python是一种面向对象、直译式计算机程序设计语言,由Guido van Rossum于1989年底发明。由于他简单、易学、免费开源、可移植性、可扩展性等特点,Python又被称之为胶水语言。下图为主要程序语...

数据007 ⋅ 2016/01/22 ⋅ 0

Android自定义控件三部曲文章索引

前言:在我从C++转到Android时,就被Android里炫彩斑斓的自定义控件深深折服,想知道如果想利用C++实现这些功能,那是相当困难的。从那时候起,我就想,等我学会了自定义控件,一定要写一篇系...

丁佳辉 ⋅ 2016/04/13 ⋅ 0

R语言与统计学习攻略

一、初学入门: 《R in Action》 《The Art of_R Programming》 入门者可首选两本,前者从统计角度入手,分高中低三部分由浅入深的讲解了如何用R来实现统计分析,另外此书已经有中文版面世。...

维特的烦恼 ⋅ 2013/11/16 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HiSDP —— 高效的C++软件开发平台

目前阿里集团每天有近1000PB的数据是通过LogAgent采集的,为了让LogAgent做到资源占用节省和高效采集,背后是基于HiSDP去构建的。 缘由 当决定采用C++编程语言去开发一个软件时,紧接着所面临...

阿里云云栖社区 ⋅ 8分钟前 ⋅ 0

zookeeper-3.4.12 下载与安装教程

一、zookeeper下载地址 http://mirrors.hust.edu.cn/apache/zookeeper/ 二、启动教程 把压缩包放在指定目录下 第三: 进入 conf文件夹底下 zoo_sample.cfg 文件名改成 zoo.cfg 第四步: 进入b...

泉天下 ⋅ 10分钟前 ⋅ 0

Oracle 中文日期转换

SELECT TO_date('2011年11月11日', 'yy"年"mm"月"dd"日"') FROM DUAL; 1. Oracle无法识别中文格式,所以添加双引号。 2. 后面的格式是指字符串在转换前的格式,而不是指转换后的格式。...

江戸川 ⋅ 11分钟前 ⋅ 0

MySell:API Spring Boot

起步 类目 商品 订单

BeanHo ⋅ 13分钟前 ⋅ 0

Spring方法拦截器MethodInterceptor

参考资料 1、Spring方法拦截器MethodInterceptor 2、Sharding JDBC源码分析-JdbcMethodInvocation类的作用

哎小艾 ⋅ 17分钟前 ⋅ 0

正则表达式

元字符 元字符,又叫字符集,就是用一些特殊符号表示特定种类的字符或位置。 匹配字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 匹配...

wangchen1999 ⋅ 17分钟前 ⋅ 0

数据库数据导入Elasticsearch案例分享

基于bboss持久层和bboss elasticsearch客户端实现数据库数据导入es案例分享(支持各种数据库和各种es版本) 1.案例对应的源码 https://gitee.com/bboss/bboss-elastic/blob/master/bboss-el...

bboss ⋅ 17分钟前 ⋅ 0

动手---sbt(2)

参考 https://blog.csdn.net/leishangwen/article/details/46225587 建立一个chisel_max目录,文件内容如后面所述,现在开始执行命令: joe@joe-Aspire-Z3730:/media/sdb4/download/scala$ c......

whoisliang ⋅ 24分钟前 ⋅ 0

纯js实现最简单的文件上传(后台使用MultipartFile)

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> //图片上传 var xhr......

孟飞阳 ⋅ 29分钟前 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift Space Battle 宇宙大战 SpriteKit游戏源码 LLDebugTool - 便捷的IOS调试工具(新增截屏功能) 相机扫描or长按识别二维码、FMDB、键盘动态高度、定位等 动画...

sunnyaigd ⋅ 30分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部