Alamofire之URLSession

Alamofire是一個(gè)在Github上非常重要的Swift的網(wǎng)絡(luò)框架,有31K的Star.它在Apple的 URLSession基礎(chǔ)上提供了更加優(yōu)雅的接口來簡化繁重而常用的網(wǎng)絡(luò)請(qǐng)求任務(wù)。

Alamofire提供了鏈?zhǔn)降?code>request/response方法,JSON的傳參和響應(yīng)序列化,身份認(rèn)證和其他特性。

URLSession的使用

 URLSession.shared.dataTask(with: url) { (data, response, error) in
       if error != nil {
            print("請(qǐng)求成功\(String(describing: response))")
       }
  }.resume()

操作

  • URLSession.shared創(chuàng)建了session會(huì)話
  • dataTask根據(jù)url創(chuàng)建了一個(gè)網(wǎng)絡(luò)任務(wù)
  • 根據(jù)dataTask進(jìn)行resume,調(diào)用執(zhí)行開始請(qǐng)求網(wǎng)絡(luò)
  • 通常我們還會(huì)設(shè)置SessionConfiguration

URLSessionConfiguration

open class URLSessionConfiguration : NSObject, NSCopying {

    open class var `default`: URLSessionConfiguration { get }

    open class var ephemeral: URLSessionConfiguration { get }

    @available(iOS 8.0, *)
    open class func background(withIdentifier identifier: String) -> URLSessionConfiguration
}

三種模式

  • default:默認(rèn)模式,通常這種模式就足夠了。默認(rèn)模式會(huì)創(chuàng)建一個(gè)持久化的緩存并在用戶的鑰匙串中存儲(chǔ)證書。
  • ephemeral:系統(tǒng)沒有任何持久性存儲(chǔ),所有內(nèi)容的生命周期都與session相同。當(dāng)session失效時(shí),所有內(nèi)容釋放。
let configuration1 = URLSessionConfiguration.default
        let configuration2 = URLSessionConfiguration.ephemeral
        print("沙盒大小: \(String(describing: configuration1.urlCache?.diskCapacity))")
        print("內(nèi)存大小: \(String(describing: configuration1.urlCache?.memoryCapacity))")
        print("沙盒大小: \(String(describing: configuration2.urlCache?.diskCapacity))")
        print("內(nèi)存大小: \(String(describing: configuration2.urlCache?.memoryCapacity))")

沙盒大小: Optional(10000000)
內(nèi)存大小: Optional(512000)
沙盒大小: Optional(0)
內(nèi)存大小: Optional(512000)
  • background:創(chuàng)建一個(gè)在后臺(tái)甚至App已經(jīng)關(guān)閉的時(shí)候仍在傳輸會(huì)話。
let configuration = URLSessionConfiguration.background(withIdentifier: self.createID())
let session = URLSession.init(configuration: configuration, delegate: self as? URLSessionDelegate, delegateQueue: OperationQueue.main)
session.downloadTask(with: url).resume()

后臺(tái)下載需要在AppDelegate中開啟權(quán)限

//用于保存后臺(tái)下載的completionHandler
   var backgroundSessionCompletionHandler: (() -> Void)?
   
   func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
       self.backgroundSessionCompletionHandler = completionHandler
   }

系統(tǒng)回調(diào),告訴系統(tǒng)及時(shí)更新屏幕

func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
       print("后臺(tái)任務(wù)下載回來")
       DispatchQueue.main.async {
           guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let backgroundHandle = appDelegate.backgroundSessionCompletionHandler else { return }
           backgroundHandle()
        }
  }
1. 常規(guī)屬性

identifier:配置對(duì)象的后臺(tái)會(huì)話標(biāo)識(shí)符。
httpAdditionalHeaders:與請(qǐng)求一起發(fā)送的附加頭文件的字典。
networkServiceType:網(wǎng)絡(luò)服務(wù)的類型
allowsCellularAccess:一個(gè)布爾值,用于確定是否應(yīng)通過蜂窩網(wǎng)絡(luò)進(jìn)行連接。
timeoutIntervalForRequest:等待其他數(shù)據(jù)時(shí)使用的超時(shí)間隔。
timeoutIntervalForResource:資源請(qǐng)求應(yīng)該允許的最大時(shí)間量。
sharedContainerIdentifier:應(yīng)該下載后臺(tái)URL會(huì)話中的文件的共享容器的標(biāo)識(shí)符。
waitsForConnectivity:一個(gè)布爾值,指示會(huì)話是否應(yīng)等待連接變?yōu)榭捎没蛘吡⒓词?/p>

2. 設(shè)置Cookie策略

httpCookieAcceptPolicy:決定何時(shí)應(yīng)該接受Cookie的策略常量
httpShouldSetCookies:一個(gè)布爾值,用于確定請(qǐng)求是否應(yīng)包含來自Cookie存儲(chǔ)的Cookie。
httpCookieStorage:管理cookie存儲(chǔ)的單一對(duì)象(共享實(shí)例)
HTTPCookie:表示HTTP cookie的對(duì)象。它是一個(gè)不可變的對(duì)象,從包含cookie屬性的字典中初始化

3. 設(shè)置安全策略

tlsMaximumSupportedProtocol:在此會(huì)話中進(jìn)行連接時(shí)客戶端應(yīng)請(qǐng)求的最大TLS協(xié)議版本。
tlsMinimumSupportedProtocol:協(xié)議協(xié)商期間應(yīng)該接受的最小TLS協(xié)議。
urlCredentialStorage:提供身份驗(yàn)證憑據(jù)的憑證存儲(chǔ)

4. 設(shè)置緩存策略

urlCache:用于向會(huì)話中的請(qǐng)求提供緩存響應(yīng)的URL緩存
requestCachePolicy:一個(gè)預(yù)定義常量,用于確定何時(shí)從緩存中返回響應(yīng)

5. 支持后臺(tái)轉(zhuǎn)移

sessionSendsLaunchEvents:一個(gè)布爾值,指示在傳輸完成時(shí)是否應(yīng)該在后臺(tái)繼續(xù)或啟動(dòng)應(yīng)用程序
isDiscretionary:一個(gè)布爾值,用于確定是否可以根據(jù)系統(tǒng)的判斷來調(diào)度后臺(tái)任務(wù)以獲得最佳性能。

6. 支持自定義協(xié)議

protocolClasses:在會(huì)話中處理請(qǐng)求的額外協(xié)議子類的數(shù)組
URLProtocol:一個(gè)NSURLProtocol對(duì)象處理加載協(xié)議特定的URL數(shù)據(jù)。在NSURLProtocol類本身是一個(gè)抽象類,可以為與特定URL方案的URL處理基礎(chǔ)設(shè)施。您可以為您的應(yīng)用支持的任何自定義協(xié)議或URL方案創(chuàng)建子類

7. 支持多路徑TCP

multipathServiceType:指定用于通過Wi-Fi和蜂窩接口傳輸數(shù)據(jù)的多路徑TCP連接策略的服務(wù)類型
URLSessionConfiguration.MultipathServiceType:指定多路徑TCP使用的服務(wù)類型的常量

8. 設(shè)置HTTP策略和代理屬性

httpMaximumConnectionsPerHost:同時(shí)連接到給定主機(jī)的最大數(shù)量。
httpShouldUsePipelining:一個(gè)布爾值,用于確定會(huì)話是否應(yīng)使用HTTP流水線
connectionProxyDictionary:包含有關(guān)在此會(huì)話中使用的代理信息的字典

9. 支持連接變化

waitsForConnectivity:一個(gè)布爾值,指示會(huì)話是否應(yīng)等待連接變?yōu)榭捎没蛘吡⒓词 ?/p>

10.NSURLRequestCachePolicy

NSURLRequestUseProtocolCachePolicy = 0: 默認(rèn)緩存策略
如果一個(gè)NSCachedURLResponse對(duì)于請(qǐng)求并不存在,數(shù)據(jù)將會(huì)從源端獲取。如果請(qǐng)求擁有一個(gè)緩存的響應(yīng),那么URL加載系統(tǒng)會(huì)檢查這個(gè)響應(yīng)來決定,如果它指定內(nèi)容必須重新生效的話。假如內(nèi)容必須重新生效,將建立一個(gè)連向源端的連接來查看內(nèi)容是否發(fā)生變化。假如內(nèi)容沒有變化,那么響應(yīng)就從本地緩存返回?cái)?shù)據(jù)。如果內(nèi)容變化了,那么數(shù)據(jù)將從源端獲取
NSURLRequestReloadIgnoringLocalCacheData = 1:URL應(yīng)該加載源端數(shù)據(jù),不使用本地緩存數(shù)據(jù)
NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4:本地緩存數(shù)據(jù)、代理和其他中介都要忽視他們的緩存,直接加載源數(shù)據(jù)
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
NSURLRequestReturnCacheDataElseLoad = 2:指定已存的緩存數(shù)據(jù)應(yīng)該用來響應(yīng)請(qǐng)求,不管它的生命時(shí)長和過期時(shí)間。如果在緩存中沒有已存數(shù)據(jù)來響應(yīng)請(qǐng)求的話,數(shù)據(jù)從源端加載
NSURLRequestReturnCacheDataDontLoad = 3:指定已存的緩存數(shù)據(jù)用來滿足請(qǐng)求,不管生命時(shí)長和過期時(shí)間。如果在緩存中沒有已存數(shù)據(jù)來響應(yīng)URL加載請(qǐng)求的話,不去嘗試從源段加載數(shù)據(jù),此時(shí)認(rèn)為加載請(qǐng)求失敗。這個(gè)常量指定了一個(gè)類似于離線模式的行為
NSURLRequestReloadRevalidatingCacheData = 5:指定如果已存的緩存數(shù)據(jù)被提供它的源段確認(rèn)為有效則允許使用緩存數(shù)據(jù)響應(yīng)請(qǐng)求,否則從源段加載數(shù)據(jù)。

是時(shí)候展現(xiàn)Alamofire的魅力

Alamofire.request(urlString)
       .responseJSON { (response) in
         print(response)
}
  • 更為簡單的操作
  • 鏈?zhǔn)秸Z法
  • 直接傳string
  • json響應(yīng)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容