Alamofire(1)— URLSession必備技能

😊😊😊Alamofire專題目錄,歡迎及時反饋交流 😊😊😊swift


Alamofire 目錄直通車 --- 和諧學習,不急不躁!api


Alamofire是一個爲iOSmacOS打造的並基於Swift的網絡庫.它在Apple的基礎網絡架構上提供了更加優雅的接口來簡化繁重而經常使用的網絡請求任務。 Alamofire提供了鏈式的request/response方法,JSON的傳參和響應序列化,身份認證和其餘特性。Alamofire的優雅之處在於它完徹底全是由Swift寫成的,而且沒有從它的Objective-C版本-AFNetworking那繼承任何特性。數組

由於咱們的Alamofire是對蘋果URLSession的封裝,因此在探索Alamofire以前,咱們來看看URLSession的必備基礎緩存

1、請求網絡的基本格式

URLSession.shared.dataTask(with: url) { (data, response, error) in
    if error == nil {
        print("請求成功\(String(describing: response))" )
    }
}.resume()
複製代碼
  • URLSession.shared提供了一個共享的單例會話對象,它爲建立任務提供了一個合理的默認行爲。使用共享會話僅用幾行代碼將URL的內容獲取到內存中。
  • dataTask建立一個網絡會話數據任務。
  • resume默認網絡任務是掛起的,調用執行開始鏈接請求網絡:三次握手...
  • 請求成果或者失敗都會回來閉包
  • 其實閉包只是一層封裝,真正來的是URLSession的代理
  • 其實在這個過程當中,咱們省略一個重要的東西:URLSessionConfiguration

2、URLSessionConfiguration

1.模式

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()
    }
}
複製代碼

爲何這麼處理,蘋果爸爸說的算閉包

2. 常規屬性

  • identifier:配置對象的後臺會話標識符。
  • httpAdditionalHeaders:與請求一塊兒發送的附加頭文件的字典。
  • networkServiceType:網絡服務的類型
  • allowsCellularAccess:一個布爾值,用於肯定是否應經過蜂窩網絡進行鏈接。
  • timeoutIntervalForRequest:等待其餘數據時使用的超時間隔。
  • timeoutIntervalForResource:資源請求應該容許的最大時間量。
  • sharedContainerIdentifier:應該下載後臺URL會話中的文件的共享容器的標識符。
  • waitsForConnectivity:一個布爾值,指示會話是否應等待鏈接變爲可用或者當即失敗

3. 設置Cookie政策

  • httpCookieAcceptPolicy:決定什麼時候應該接受Cookie的策略常量
  • httpShouldSetCookies:一個布爾值,用於肯定請求是否應包含來自Cookie存儲的Cookie
  • httpCookieStorage:管理cookie存儲的單一對象(共享實例)
  • HTTPCookie:表示HTTP cookie的對象。它是一個不可變的對象,從包含cookie屬性的字典中初始化

4. 設置安全策略

  • tlsMaximumSupportedProtocol:在此會話中進行鏈接時客戶端應請求的最大TLS協議版本。
  • tlsMinimumSupportedProtocol:協議協商期間應該接受的最小TLS協議
  • urlCredentialStorage:提供身份驗證憑據的憑證存儲

5. 設置緩存策略

  • urlCache:用於向會話中的請求提供緩存響應的URL緩存
  • requestCachePolicy:一個預約義常量,用於肯定什麼時候從緩存中返回響應

7. 支持後臺轉移

  • sessionSendsLaunchEvents:一個布爾值,指示在傳輸完成時是否應該在後臺繼續或啓動應用程序
  • isDiscretionary:一個布爾值,用於肯定是否能夠根據系統的判斷來調度後臺任務以得到最佳性能。

7. 支持自定義協議

  • protocolClasses:在會話中處理請求的額外協議子類的數組
  • URLProtocol:一個NSURLProtocol對象處理加載協議特定的URL數據。在NSURLProtocol類自己是一個抽象類,能夠爲與特定URL方案的URL處理基礎設施。您能夠爲您的應用支持的任何自定義協議或URL方案建立子類

8. 支持多路徑TCP

  • multipathServiceType:指定用於經過Wi-Fi和蜂窩接口傳輸數據的多路徑TCP鏈接策略的服務類型
  • URLSessionConfiguration.MultipathServiceType:指定多路徑TCP使用的服務類型的常量

9. 設置HTTP策略和代理屬性

  • httpMaximumConnectionsPerHost:同時鏈接到給定主機的最大數量。
  • httpShouldUsePipelining:一個布爾值,用於肯定會話是否應使用HTTP流水線
  • connectionProxyDictionary:包含有關在此會話中使用的代理信息的字典

10. 支持鏈接變化

  • waitsForConnectivity:一個布爾值,指示會話是否應等待鏈接變爲可用或者當即失敗。

3、NSURLRequestCachePolicy

  • NSURLRequestUseProtocolCachePolicy = 0,: 默認緩存策略 若是一個NSCachedURLResponse對於請求並不存在,數據將會從源端獲取。若是請求擁有一個緩存的響應,那麼URL加載系統會檢查這個響應來決定,若是它指定內容必須從新生效的話。假如內容必須從新生效,將創建一個連向源端的鏈接來查看內容是否發生變化。假如內容沒有變化,那麼響應就從本地緩存返回數據。若是內容變化了,那麼數據將從源端獲取
  • NSURLRequestReloadIgnoringLocalCacheData = 1:URL應該加載源端數據,不使用本地緩存數據
  • NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4:本地緩存數據、代理和其餘中介都要忽視他們的緩存,直接加載源數據
  • NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
  • NSURLRequestReturnCacheDataElseLoad = 2:指定已存的緩存數據應該用來響應請求,無論它的生命時長和過時時間。若是在緩存中沒有已存數據來響應請求的話,數據從源端加載
  • NSURLRequestReturnCacheDataDontLoad = 3:指定已存的緩存數據用來知足請求,無論生命時長和過時時間。若是在緩存中沒有已存數據來響應URL加載請求的話,不去嘗試從源段加載數據,此時認爲加載請求失敗。這個常量指定了一個相似於離線模式的行爲
  • NSURLRequestReloadRevalidatingCacheData = 5:指定若是已存的緩存數據被提供它的源段確認爲有效則容許使用緩存數據響應請求,不然從源段加載數據。

OK,整理完畢!但願讀者可以對URLSession更瞭解一些!架構

就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!

相關文章
相關標籤/搜索