😊😊😊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度仰望天空,該死!我這無處安放的魅力!