Alamofire-初探
对于iOS开发者来说,
AFNetworking
是我们大家所熟知的,而Alamofire
呢?Alamofire
框架其实就是AFNetworking
兄弟,出自于同一个作者。既是同一个作者,那么他们的使用方法,框架结构上应该也是保持一致的。AFNetworking、Alamofire
一、网络请求步骤
- 设置请求
url
- 设置
URLRequest
对象,配置请求相关信息 - 创建会话配置
URLSessionConfiguration
- 创建会话
URLSession
- 创建任务和设置请求回调,并发起请求
一般通过以上几个步来完成网络请求,当然要根据不同应用场景来配置请求属性。
二、体验
发起一个请求:
func responseData() {let url = "http://onapp.yahibo.top/public/?s=api/test/list"Alamofire.request(url).responseJSON {(response) inswitch response.result{case .success(let json):print("json:\(json)")let dict = json as! Dictionary<String, Any>let list = dict["data"] as! Array<AnyObject>guard let result = [UserModel1].deserialize(from: list) else{return}self.observable.onNext(result as [Any])breakcase .failure(let error):print("error:\(error)")break}}
}
responseJSON
为相应类型,指定为json
数据类型response
是Alamofire
对服务器响应结果的封装- 使用常规解包获取数据
headimg
- 通过
HandyJSON
转换为模型数据,供UI
展示
直接通过Alamofire
发起请求通过一个闭包返回请求结果,不需要二次封装使用简单。这里我们没有标明请求类型,没有请求参数,那Alamofire
是如何封装这些请求参数的呢,点击进入查看方法定义:
public func request(_ url: URLConvertible,method: HTTPMethod = .get,parameters: Parameters? = nil,encoding: ParameterEncoding = URLEncoding.default,headers: HTTPHeaders? = nil)-> DataRequest
{return SessionManager.default.request(url,method: method,parameters: parameters,encoding: encoding,headers: headers)
}
这里已经提供了请求所需要的参数,并设置了默认值,因此外界在没有指定方法时默认为get
方式。根据实际开发需求设置响应的参数:
Alamofire.request(url,method: .post,parameters: ["page":"1","size":"20"]).responseJSON
这是我们开发中常见的设置请求方式,请求参数,这里的url
支持多种数据类型,可以是String、URL、URLRequest
等类型,为什么这么设计呢?因为在项目中可能当前我们跟前有一个String
类型的连接,也有可能是个URL
类型的连接,这时候在不需要转换的情况下就可以直接使用,方便快捷,更加灵活。
效果如下:
三、URLSession
同样在Alamofire
中也是对URLSession
封装的,在OC
中为NSURLSession
,其实是一样的。一般网络请求分三个步骤:
1、设置URL请求地址
let url = URL.init(string: "协议://主机地址/路径/参数1&参数2")!
- 协议:指定
http
协议还是https
协议 - 主机:即服务器地址
ip
地址或绑定ip
的域名 - 路径:项目在服务器上的位置
- 参数:即
get
参数拼接在连接上
2、设置URLRequest属性
var request = URLRequest.init(url: url)
request.httpMethod = HTTPMethod.post.rawValue
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let postData = ["username":"hibo","password":"123456"]
request.httpBody = try?JSONSerialization.data(withJSONObject: postData, options: [])
request.timeoutInterval = 30
request.cachePolicy = .useProtocolCachePolicy
httpMethod
设置请求方式post
或get
setValue
设置请求头信息httpBody
设置请求参数,参数打包在请求体中timeoutInterval
设置请求超时时间cachePolicy
设置网络请求缓存策略
通过以上的参数设置,能够感受到发送一次请求是多么不容易,因此网络请求是必须要被封装的
3、发起请求
URLSession.shared.dataTask(with: request) { (data, response, error) inprint("*******网络请求*******")do {let list = try JSONSerialization.jsonObject(with: data!, options: .allowFragments)print(list)}catch{print(error)}
}.resume()
URLSession.shared
为全局共享单例会话对象- 调用
dataTask
创建网络请求任务 resume
默认为挂起状态,调用重新启动网络请求任务data
:请求到的数据流,通过JSONSerialization
序列化为json
格式使用
四、URLSessionConfiguration
在URLSession.shared
中内部已经配置了该项,此项为会话配置项,一般使用都会进行配置以适用于不同场景。查看该类如下:
open class var `default`: URLSessionConfiguration { get }
open class var ephemeral: URLSessionConfiguration { get }
@available(iOS 8.0, *)
open class func background(withIdentifier identifier: String) -> URLSessionConfiguration
default
:默认模式,常用模式,在该模式下系统会创建持久化缓存,并在用户的钥匙串中保存证书ephemeral
:不支持持久性存储,所有内容的会随着session
的生命周期结束而释放background
:与default
模式类似,在该模式下会创建一个独立线程来传输网络请求数据,可以在后台乃至APP关闭的时候也可以进行数据传输
创建一个会话:
let configuration = URLSessionConfiguration.background(withIdentifier: "request_id")
let session = URLSession.init(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)
session.dataTask(with: request) { (data, response, error) inprint("*******网络请求*******")do {let list = try JSONSerialization.jsonObject(with: data!, options: .allowFragments)print(list)}catch{print(error)}
}.resume()
- 设置一个唯一会话标识,通过标识来区分不同的会话任务
- 遵循
URLSessionDelegate
代理,实现代理方法,在本类中监控任务进度
下载任务:
let configuration = URLSessionConfiguration.background(withIdentifier: "request_id")
let session = URLSession.init(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)
session.downloadTask(with: url).resume()
**注意在使用background
模式时一定要开启后台下载权限,否则无法完成后台下载并回调数据。**需要以下两步才能完成:
1、开启后台下载权限
var backgroundHandler: (()->Void)? = nil
//设置此处开启后台下载权限
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {self.backgroundHandler = completionHandler
}
2、实现SessionDelegate
代理方法,调用闭包方法,通知系统更新屏幕
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {print("后台任务下载回来")DispatchQueue.main.async {guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let backgroundHandle = appDelegate.backgroundHandler else { return }backgroundHandle()}
}
苹果官方给出需要实现以上两个方法来完成后台下载,通知系统及时更新屏幕。官方文档
五、相关属性
官方文档
1、常规属性
identifier:
配置对象的后台会话标识符httpAdditionalHeaders:
与请求一起发送的附加头文件字典networkServiceType:
网络服务的类型allowsCellularAccess:
一个布尔值,用于是否应通过蜂窝网络进行连接timeoutIntervalForRequest:
等待附加数据的超时时间timeoutIntervalForResource:
资源请求允许的最大时间范围sharedContainerIdentifier:
应将后台URL会话中的文件下载到的共享容器的标识符waitsForConnectivity:
一个布尔值,指示会话是否应等待连接变为可用还是立即失败
2、设置Cookie策略
httpCookieAcceptPolicy:
决定何时接受cookie的策略常量httpShouldSetCookies:
一个布尔值,确定请求是否包含来自cookie
存储区的cookie
httpCookieStorage
:用于会话中存储cookie
的cookie
存储区HTTPCookie:
该对象为不可变对象,从包含cookie
属性的字典初始化,支持两个不同的cookie版本,v0、v1
3、设置安全策略
TLS协议:
用于在两个通信应用程序之间提供保密性和数据完整性tlsMaximumSupportedProtocol:
在此会话中建立连接时客户端应请求的最大TLS协议
版本tlsMinimumSupportedProtocol:
协议协商期间应接受的最小TLS协议
urlCredentialStorage:
为身份验证提供凭据的凭据存储区
4、设置缓存策略
urlCache:
用于为会话中的请求提供缓存响应的URL
缓存requestCachePolicy:
决定何时从缓存中返回响应的预定义常量
5、支持后台转移
sessionSendsLaunchEvents:
一个布尔值,指示当传输完成时,应用程序应在后台恢复还是启动isDiscretionary:
一个布尔值,用于确定后台任务是否可以由系统自行安排已获得最佳性能shouldUseExtendedBackgroundIdleMode:
一个布尔值,指示当应用程序转移到后台时是否应保持TCP
连接打开
6、支持自定义协议
protocolClasses:
在会话中处理请求的额外协议子类的数组URLProtocol:
该对象用来处理加载协议特定URL
数据
7、支持多路径TCP
multipathServiceType:
指定用于通过Wi-Fi
和蜂窝接口传输数据的多路径TCP
连接策略的服务类型
8、设置HTTP策略和代理属性
httpMaximumConnectionsPerHost:
同时连接到给定主机的最大数量httpShouldUsePipelining:
一个布尔值,用于确定会话是否使用HTTP
流水线connectionProxyDictionary:
包含相关要在此会话中使用的代理信息的字典
9、支持连接更改
waitsForConnectivity:
一个布尔值,指示会话应等待连接可用还是立即失败
一个请求任务就有如此多的配置属性,可想而知对一个网络框架的整合,工作量也是非常大的。接下来我们就一步步来了解一下Alamofire是如何一步步整合的。
Alamofire-初探相关推荐
- Alamofire初探
上一篇文章介绍了AFNetworking网络库,作为它的姊妹Alamofire,不得不介绍下. 今天我们就来介绍Alamofire的使用. 前言 Alamofire是使用Swift语言开发的网络库,它 ...
- 2021年大数据Flink(九):Flink原理初探
Flink原理初探 Flink角色分工 在实际生产中,Flink 都是以集群在运行,在运行的过程中包含了两类进程. JobManager: 它扮演的是集群管理者的角色,负责调度任务.协调 checkp ...
- 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书
缘起 哈喽大家周四好!又是开心的一天,时间过的真快,我们的 <从壹开始 .net core 2.1 + vue 2.5 >前后端分离系列共 34 篇已经完结了,当然以后肯定还会有更新和修改 ...
- 经典算法研究系列:二、Dijkstra 算法初探
经典算法研究系列:二.Dijkstra 算法初探 July 二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...
- Swift - 使用Alamofire通过HTTPS进行网络请求,及证书的使用
(本文代码已升级至Swift3) 我原来写过一篇文章介绍如何使用证书通过SSL/TLS方式进行网络请求(Swift - 使用URLSession通过HTTPS进行网络请求,及证书的使用),当时用的是 ...
- swift集成alamofire的简单封装
import UIKit import Alamofire enum MethodType{ case GET case POST } class NetworkTool: NSObject { cl ...
- las格式测井曲线_邹榕,等:顺北和托甫台区块奥陶系断裂结构单元测井响应特征初探...
引用格式:邹榕,徐中祥,张晓明,等.顺北和托甫台区块奥陶系断裂结构单测井响应特征初探[J].油气藏评价与开发,2020,10(2):18-23.ZOUR, XU Z X, ZHANG X M, et ...
- 2018-4-15摘录笔记,《网络表征学习前沿与实践》 崔鹏以及《网络表征学习中的基本问题初探》 王啸 崔鹏 朱文武
1.来源:<网络表征学习前沿与实践> 崔鹏 (1)随着数据的增加以及计算机计算速度的增加,想当然的以为速度快了,数据再多也是可以自己算的,但是若是数据之间存在着复杂的关系,那么处理一个样 ...
- Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire
升级到 Swift3.0 之后,新版本的 Alamofire 只支持 iOS 9.0 以上的系统,如果要适配 iOS 8,需要自己封装 URLSession,下面是笔者的方案: 这里使用的是 Swif ...
- python argparse_Python 命令行之旅:初探 argparse
本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任 ...
最新文章
- python数据导入hive_Python操作HIve,将数据插入到Mysql
- vivo C/C++工程师视频面试总结 20180802
- Android的简介
- 计算机考试没考好的检讨书,关于考试没考好检讨书(精选5篇)
- 用脚本实现FTP的上传和下载
- php跳转方式带rere_PHP利用REFERER根居访问来地址进行页面跳转
- iOS UITableView设置UITableViewStyleGrouped模式下section间多余间距的处理
- java程卫琴_43名基层工会干部在“机关开放日”走进安徽省总工会参观并座谈
- Civil 3d 之枚举 SpiralType
- python快速实现简单的图像人脸融合
- 入行月薪过万的数据挖掘必看的学习建议!
- 使用bat批量删除修改子目录文件名后缀,超简单
- 1个月拿下7个offer! 5分钟掌握81个数学模型,小白也能逆袭数据分析师!
- 操作系统-文件存储空间管理
- ENVI|一天一个小技能|APP STORE浏览并下载矢量数据
- Mysql配置文件/etc/my.cnf解析
- vmware虚拟机安装 安卓Android x86 8.1
- HTML个人简历表制作
- Linus工作室 2021年 PB级存储方案
- python学习-海龟作图