iOS 原生網絡請求快速回顧

URL Loading System

在瞭解Alamofire,AFNetworking以前,須要複習原生網絡是怎麼使用的。swift

主要分爲三大塊, URLSessionConfigurationURLSessionURLSessionTask緩存

URLSessionConfiguration

URLSessionConfigurationURLSession初始化時,必須傳入的參數,設定如何去使用caches,cookies等緩存策略,或者超時時間的設定,或者是否容許在非wifi的移動網上使用等等。 在建立時,主要分爲三類。服務器

  1. Default。默認設定。
  2. ephemeral。不對caches, cookies, or credentials使用存儲。
  3. backgroud。容許上傳下載等操做能夠在後臺執行。

在使用URLSessionConfiguration建立URLSession須要注意: 在初始化以前,須要對Config進行充足的設定,在建立後Session會拷貝一份保存,因此這時候再對Config進行修改,則不會影響Session。若是這時候須要修改一些Config的內容,就只能經過更新Config後再從新建立Session。cookie

在大部分狀況下,NSURLRequest可以override Configruation中的內容,好比超時時間的設定,但對於某些嚴格的參數,好比allowsCellularAccess,則不能覆蓋。網絡

URLSession

經過設定URLSessionConfiguration以後,就能夠建立URLSession,URLSession的主要功能就是建立一個或者多個 URLSessionTask的實例。session

在建立時,能夠指定URLSessionDelegate 以及 delegateQueue,若是不須要delegate,直接傳入nil便可。閉包

init(configuration: URLSessionConfiguration, delegate: URLSessionDelegate?, delegateQueue queue: OperationQueue?)
複製代碼

URLSessionDelegate的繼承關係: URLSessionDelegate -> URLSessionTaskDelegate -> [URLSessionDataDelegate, URLSessionDownloadDelegate, URLSessionStreamDelegate, URLSessionWebSocketDelegate]app

須要注意的是,這裏的Degelate是會被Session以強引用的方式持有,若是沒有對Session調用invalidateAndCancel() 或者finishTasksAndInvalidate(),那麼生命週期會知道app關閉,形成內存泄漏。ide

這裏的queue是指代調用Delegate中方法或者是completion handlers使用的隊列。爲了保證正確的順序,該線程必須是串行隊列,若是沒有指定,session也會自動建立。性能

若是不指定delegate, 在穿件task以後則執行傳入的閉包:

let task = URLSession.shared.dataTask(with: url) { data, response, error in
	dosomething()
}
task.resume()
複製代碼

URLSesion

若是指定了delegate,則沒必要再傳入handler,若是傳入,則不會走delegate的回調。

private lazy var session: URLSession = {
    let configuration = URLSessionConfiguration.default
    configuration.waitsForConnectivity = true
    return URLSession(configuration: configuration,
                      delegate: self, delegateQueue: nil)
}()

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
    self.receivedData?.append(data)
}
複製代碼

URLSesion

URLSessionTask

URLSessionTask,由URLSession生成,主要分爲四種: URLSessionDataTask:通常請求資源,返回服務器的response,做爲NSData對象緩存在內存中。不支持background session生成。 URLSessionUploadTask: 與URLSessionDataTask相似,可是請求中添加request body更加容易。 URLSessionDownloadTask: 支持直接在磁盤中下載文件。 URLSessionStreamTask:流任務從主機名和端口或網絡服務對象創建TCP / IP鏈接。。

在建立Task以後,若是調用了resume,session會自動將其設爲強引用,直到請求結束或者失敗,因此開發者不必去維持一個引用。

除了resume,還有cancel,suspend等方法進行操做。

緩存系統

URLCache

在網絡請求中,會在內存或者磁盤中緩存response,以此提升性能以及減小網絡交互。

緩存數據的類叫作URLCache,緩存從NSURLRequest映射爲CachedURLResponse的對象。

在磁盤上的緩存也會當磁盤空間低的時候被系統移除,也只會在app未開啓的狀況下。

若是想自定義URLCache,好比緩存大小,須要在URLSessionConfiguration中設定。

Cache Policy

對於每個URLRequest的實例,都有緩存屬性cachePolicy。

爲了方便統一管理,能夠直接對URLSessionConfiguration的requestCachePolicy屬性進行設置,這樣每個使用Config的Session生成請求的cachePolicy都會繼承。

緩存策略分爲4種:

  • reloadIgnoringLocalCacheData: 忽略本地緩存,直接從遠端獲取資源。
  • returnCacheDataDontLoad:只從緩存中獲取,不會對遠端發起請求,若是沒有緩存則會進入fail,通常用與離線模式。
  • returnCacheDataElseLoad: 從緩存中獲取,若是沒有緩存則對遠端發起請求。
  • useProtocolCachePolicy:默認策略。

若是沒有緩存,則發起請求; 若是緩存的響應不須要每次都從新驗證,而且緩存的響應沒有過時,則返回緩存。若是緩存過時或須要從新驗證,則向原始源發出HEAD請求,以查看資源是否已更改。若是修改了,將從原始源獲取數據,若是不是,則返回緩存內容。

URLSesion
相關文章
相關標籤/搜索