😊😊😊Alamofire专题目录,欢迎及时反馈交流 😊😊😊swift
Alamofire 目录直通车 --- 和谐学习,不急不躁!api
Alamofire是一个为
iOS
和macOS
打造的并基于Swift
的网络库.它在Apple
的基础网络架构上提供了更加优雅的接口来简化繁重而经常使用的网络请求任务。Alamofire
提供了链式的request/response
方法,JSON
的传参和响应序列化,身份认证和其余特性。Alamofire
的优雅之处在于它完彻底全是由Swift
写成的,而且没有从它的Objective-C
版本-AFNetworking
那继承任何特性。数组
由于咱们的Alamofire
是对苹果URLSession
的封装,因此在探索Alamofire
以前,咱们来看看URLSession
的必备基础缓存
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error == nil {
print("请求成功\(String(describing: response))" )
}
}.resume()
复制代码
URLSession.shared
提供了一个共享的单例会话对象,它为建立任务提供了一个合理的默认行为。使用共享会话仅用几行代码将URL的内容获取到内存中。dataTask
建立一个网络会话数据任务。resume
默认网络任务是挂起的,调用执行开始链接请求网络:三次握手...
URLSession
的代理URLSessionConfiguration
URLSessionConfiguration
初始化有三种模式:安全
default
:默认模式,一般咱们用这种模式就足够了。default
模式下系统会建立一个持久化的缓存并在用户的钥匙串中存储证书cookie
ephemeral
: 系统没有任何持久性存储,全部内容的生命周期都与session
相同,当session
无效时,全部内容自动释放。网络
let configuration1 = URLSessionConfiguration.default
let configuration2 = URLSessionConfiguration.ephemeral
print("沙盒大小: \(String(describing: configuration1.urlCache?.diskCapacity))")
print("内存大小: \(String(describing: configuration1.urlCache?.memoryCapacity))")
print("沙盒大小: \(String(describing: configuration2.urlCache?.diskCapacity))")
print("内存大小: \(String(describing: configuration2.urlCache?.memoryCapacity))")
打印结果:
沙盒大小: Optional(10000000)
内存大小: Optional(512000)
沙盒大小: Optional(0)
内存大小: Optional(512000)
复制代码
background
建立一个能够在后台甚至APP已经关闭的时候仍然在传输数据的会话。background
模式与default
模式很是类似,不过background
模式会用一个独立线程来进行数据传输。background
模式能够在程序挂起,退出,崩溃的状况下运行task。也能够利用标识符来恢复进。注意,后台Session
必定要在建立的时候赋予一个惟一的identifier,这样在APP下次运行的时候,可以根据identifier
来进行相关的区分。若是用户关闭了APP,IOS 系统会关闭全部的background Session。并且,被用户强制关闭了之后,IOS系统不会主动唤醒APP,只有用户下次启动了APP,数据传输才会继续// 初始化一个后台的模式的会话配置
let configuration = URLSessionConfiguration.background(withIdentifier: self.createID())
// 初始化session会话
let session = URLSession.init(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)
// 传入url开启下载
session.downloadTask(with: url).resume()
复制代码
session
会话url
开启下载resume
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64)
复制代码
URLSessionDownloadDelegate
代理func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
复制代码
上面这么设置,还不能达到后台下载!还须要设置下面两步session
//用于保存后台下载的completionHandler
var backgroundSessionCompletionHandler: (() -> Void)?
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
self.backgroundSessionCompletionHandler = completionHandler
}
复制代码
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
print("后台任务下载回来")
DispatchQueue.main.async {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let backgroundHandle = appDelegate.backgroundSessionCompletionHandler else { return }
backgroundHandle()
}
}
复制代码
为何这么处理,苹果爸爸说的算闭包
identifier:
配置对象的后台会话标识符。httpAdditionalHeaders:
与请求一块儿发送的附加头文件的字典。networkServiceType:
网络服务的类型allowsCellularAccess:
一个布尔值,用于肯定是否应经过蜂窝网络进行链接。timeoutIntervalForRequest:
等待其余数据时使用的超时间隔。timeoutIntervalForResource:
资源请求应该容许的最大时间量。sharedContainerIdentifier:
应该下载后台URL会话中的文件的共享容器的标识符。waitsForConnectivity:
一个布尔值,指示会话是否应等待链接变为可用或者当即失败httpCookieAcceptPolicy:
决定什么时候应该接受Cookie
的策略常量httpShouldSetCookies:
一个布尔值,用于肯定请求是否应包含来自Cookie
存储的Cookie
。httpCookieStorage:
管理cookie
存储的单一对象(共享实例)HTTPCookie:
表示HTTP cookie
的对象。它是一个不可变的对象,从包含cookie
属性的字典中初始化tlsMaximumSupportedProtocol:
在此会话中进行链接时客户端应请求的最大TLS协议
版本。tlsMinimumSupportedProtocol:
协议协商期间应该接受的最小TLS协议
。urlCredentialStorage:
提供身份验证凭据的凭证存储urlCache:
用于向会话中的请求提供缓存响应的URL
缓存requestCachePolicy:
一个预约义常量,用于肯定什么时候从缓存中返回响应sessionSendsLaunchEvents:
一个布尔值,指示在传输完成时是否应该在后台继续或启动应用程序isDiscretionary:
一个布尔值,用于肯定是否能够根据系统的判断来调度后台任务以得到最佳性能。protocolClasses:
在会话中处理请求的额外协议子类的数组URLProtocol:
一个NSURLProtocol
对象处理加载协议特定的URL
数据。在NSURLProtocol
类自己是一个抽象类,能够为与特定URL
方案的URL
处理基础设施。您能够为您的应用支持的任何自定义协议或URL
方案建立子类multipathServiceType:
指定用于经过Wi-Fi和蜂窝接口传输数据的多路径TCP链接策略的服务类型URLSessionConfiguration.MultipathServiceType:
指定多路径TCP使用的服务类型的常量httpMaximumConnectionsPerHost:
同时链接到给定主机的最大数量。httpShouldUsePipelining:
一个布尔值,用于肯定会话是否应使用HTTP流水线connectionProxyDictionary:
包含有关在此会话中使用的代理信息的字典waitsForConnectivity:
一个布尔值,指示会话是否应等待链接变为可用或者当即失败。NSURLRequestUseProtocolCachePolicy = 0,:
默认缓存策略 若是一个NSCachedURLResponse
对于请求并不存在,数据将会从源端获取。若是请求拥有一个缓存的响应,那么URL
加载系统会检查这个响应来决定,若是它指定内容必须从新生效的话。假如内容必须从新生效,将创建一个连向源端的链接来查看内容是否发生变化。假如内容没有变化,那么响应就从本地缓存返回数据。若是内容变化了,那么数据将从源端获取NSURLRequestReloadIgnoringLocalCacheData = 1:
URL应该加载源端数据,不使用本地缓存数据NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4:
本地缓存数据、代理和其余中介都要忽视他们的缓存,直接加载源数据NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
NSURLRequestReturnCacheDataElseLoad = 2:
指定已存的缓存数据应该用来响应请求,无论它的生命时长和过时时间。若是在缓存中没有已存数据来响应请求的话,数据从源端加载NSURLRequestReturnCacheDataDontLoad = 3:
指定已存的缓存数据用来知足请求,无论生命时长和过时时间。若是在缓存中没有已存数据来响应URL
加载请求的话,不去尝试从源段加载数据,此时认为加载请求失败。这个常量指定了一个相似于离线模式的行为NSURLRequestReloadRevalidatingCacheData = 5:
指定若是已存的缓存数据被提供它的源段确认为有效则容许使用缓存数据响应请求,不然从源段加载数据。OK,整理完毕!但愿读者可以对
URLSession
更了解一些!架构就问此时此刻还有谁?45度仰望天空,该死!我这无处安放的魅力!