在瞭解Alamofire,AFNetworking以前,須要複習原生網絡是怎麼使用的。swift
主要分爲三大塊, URLSessionConfiguration
、 URLSession
、URLSessionTask
。緩存
URLSessionConfiguration
是URLSession
初始化時,必須傳入的參數,設定如何去使用caches,cookies等緩存策略,或者超時時間的設定,或者是否容許在非wifi的移動網上使用等等。 在建立時,主要分爲三類。服務器
在使用URLSessionConfiguration
建立URLSession
須要注意: 在初始化以前,須要對Config進行充足的設定,在建立後Session會拷貝一份保存,因此這時候再對Config進行修改,則不會影響Session。若是這時候須要修改一些Config的內容,就只能經過更新Config後再從新建立Session。cookie
在大部分狀況下,NSURLRequest
可以override Configruation中的內容,好比超時時間的設定,但對於某些嚴格的參數,好比allowsCellularAccess,則不能覆蓋。網絡
經過設定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()
複製代碼
若是指定了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)
}
複製代碼
URLSessionTask
,由URLSession
生成,主要分爲四種: URLSessionDataTask
:通常請求資源,返回服務器的response,做爲NSData對象緩存在內存中。不支持background session生成。 URLSessionUploadTask
: 與URLSessionDataTask相似,可是請求中添加request body更加容易。 URLSessionDownloadTask
: 支持直接在磁盤中下載文件。 URLSessionStreamTask
:流任務從主機名和端口或網絡服務對象創建TCP / IP鏈接。。
在建立Task以後,若是調用了resume,session會自動將其設爲強引用,直到請求結束或者失敗,因此開發者不必去維持一個引用。
除了resume,還有cancel,suspend等方法進行操做。
在網絡請求中,會在內存或者磁盤中緩存response,以此提升性能以及減小網絡交互。
緩存數據的類叫作URLCache,緩存從NSURLRequest映射爲CachedURLResponse的對象。
在磁盤上的緩存也會當磁盤空間低的時候被系統移除,也只會在app未開啓的狀況下。
若是想自定義URLCache,好比緩存大小,須要在URLSessionConfiguration中設定。
對於每個URLRequest的實例,都有緩存屬性cachePolicy。
爲了方便統一管理,能夠直接對URLSessionConfiguration
的requestCachePolicy屬性進行設置,這樣每個使用Config的Session生成請求的cachePolicy都會繼承。
緩存策略分爲4種:
若是沒有緩存,則發起請求; 若是緩存的響應不須要每次都從新驗證,而且緩存的響應沒有過時,則返回緩存。若是緩存過時或須要從新驗證,則向原始源發出HEAD請求,以查看資源是否已更改。若是修改了,將從原始源獲取數據,若是不是,則返回緩存內容。