对于iOS开发者来说,
AFNetworking
是我们大家所熟知的,而Alamofire
呢?Alamofire
框架其实就是AFNetworking
兄弟,出自于同一个作者。既是同一个作者,那么他们的使用方法,框架结构上应该也是保持一致的。AFNetworking、Alamofire
一、回顾苹果原生网络请求
一、网络请求步骤
- 设置请求
url
- 设置
URLRequest
对象,配置请求相关信息 - 创建会话配置
URLSessionConfiguration
- 创建会话
URLSession
- 创建任务和设置请求回调,并发起请求
一般通过以上几个步来完成网络请求,当然要根据不同应用场景来配置请求属性。
二、体验
发起一个请求:
1 | func responseData() { |
responseJSON
为相应类型,指定为json
数据类型response
是Alamofire
对服务器响应结果的封装- 使用常规解包获取数据
headimg
- 通过
HandyJSON
转换为模型数据,供UI
展示
直接通过Alamofire
发起请求通过一个闭包返回请求结果,不需要二次封装使用简单。这里我们没有标明请求类型,没有请求参数,那Alamofire
是如何封装这些请求参数的呢,点击进入查看方法定义:
这里已经提供了请求所需要的参数,并设置了默认值,因此外界在没有指定方法时默认为get
方式。根据实际开发需求设置响应的参数:
1 | Alamofire.request(url,method: .post,parameters: ["page":"1","size":"20"]).responseJSON |
这是我们开发中常见的设置请求方式,请求参数,这里的url
支持多种数据类型,可以是String、URL、URLRequest
等类型,为什么这么设计呢?因为在项目中可能当前我们跟前有一个String
类型的连接,也有可能是个URL
类型的连接,这时候在不需要转换的情况下就可以直接使用,方便快捷,更加灵活。
三、URLSession
同样在Alamofire
中也是对URLSession
封装的,在OC
中为NSURLSession
,其实是一样的。一般网络请求分三个步骤:
1、设置URL请求地址
1 | let url = URL.init(string: "协议://主机地址/路径/参数1&参数2")! |
- 协议:指定
http
协议还是https
协议 - 主机:即服务器地址
ip
地址或绑定ip
的域名 - 路径:项目在服务器上的位置
- 参数:即
get
参数拼接在连接上
2、设置URLRequest属性
1 | var request = URLRequest.init(url: url) |
httpMethod
设置请求方式post
或get
setValue
设置请求头信息httpBody
设置请求参数,参数打包在请求体中timeoutInterval
设置请求超时时间cachePolicy
设置网络请求缓存策略
通过以上的参数设置,能够感受到发送一次请求是多么不容易,因此网络请求是必须要被封装的
3、发起请求
1 | URLSession.shared.dataTask(with: request) { (data, response, error) in |
URLSession.shared
为全局共享单例会话对象- 调用
dataTask
创建网络请求任务 resume
默认为挂起状态,调用重新启动网络请求任务data
:请求到的数据流,通过JSONSerialization
序列化为json
格式使用
四、URLSessionConfiguration
在URLSession.shared
中内部已经配置了该项,此项为会话配置项,一般使用都会进行配置以适用于不同场景。查看该类如下:
1 | open class var `default`: URLSessionConfiguration { get } |
default
:默认模式,常用模式,在该模式下系统会创建持久化缓存,并在用户的钥匙串中保存证书ephemeral
:不支持持久性存储,所有内容的会随着session
的生命周期结束而释放background
:与default
模式类似,在该模式下会创建一个独立线程来传输网络请求数据,可以在后台乃至APP关闭的时候也可以进行数据传输
创建一个会话:
1 | let configuration = URLSessionConfiguration.background(withIdentifier: "request_id") |
- 设置一个唯一会话标识,通过标识来区分不同的会话任务
- 遵循
URLSessionDelegate
代理,实现代理方法,在本类中监控任务进度
下载任务:
1 | let configuration = URLSessionConfiguration.background(withIdentifier: "request_id") |
注意在使用background
模式时一定要开启后台下载权限,否则无法完成后台下载并回调数据。需要以下两步才能完成:
1、开启后台下载权限
1 | var backgroundHandler: (()->Void)? = nil |
2、实现SessionDelegate
代理方法,调用闭包方法,通知系统更新屏幕
1 | func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) { |
苹果官方给出需要实现以上两个方法来完成后台下载,通知系统及时更新屏幕。官方文档