Swift 示範如何客製化元件,圖片下載套件(2)串上http Get 作法, URLSessionConfiguration基本觀念

Lin
1 min readJun 19, 2018

--

這邊示範必較新的Apple關於web service URLSession這個元件

URLConnection的後繼者 URLSession

URLSession類原生支持datafileftphttphttps協議。跟它比較相關的另外一個類是URLSessionConfiguration,這個類可以用來設置會話的相關配置,在初始化會話實例時,有可能會用到。

  1. 可進行更詳細設定
  2. 可以對上傳或下載的工作去取消,暫停,繼續,等等的操作
  3. 可以在App在背景的時候,持續的上傳或下載
  4. 可以支援Delegate 或 closure 進行互動(這邊範例使用closure,下載之後的結果會從closure回來)

透過指定URLSessionConfiguration的參數,可以指定以下的三大類使用

  1. default: 預設的設定,類似於URLConnection的運作模式,傳輸的資量大時,將於內部儲存空間暫停

備註:default跟傳統URLconnectione功能幾乎一模一樣,也就是說你任務是要負責改寫把原本URLconnectione改成URLSession,這時候你就可以選擇Default,他是拿來替換基本型的Configuration,這個Configuration會有個特性,我今天下載是很大的檔案,比如說我下載一個500m大檔,基本上我不可能把500m都放在記憶體裡面,很多iphone手機1G的記憶體,以default這個Configuration來說,當他發現這下載東西很大的時候,他會幫我們存在硬碟裡面做暫存,他不會傻傻傻全都靠記憶體堆積起來

  1. ephemeral:專供臨時傳輸所需的設定,小量傳輸資料用,所有東西都會儲存於記憶體中,當App結束Session時,所有的資訊都會消失,他不會暫存在硬碟

備註ephemeral: 假設我今天有一些下載任務,資料不會太大,一下就下載好了,下載之後,我沒有要做快取,保存這些需求就可選擇ephemeral,他所有東西都會存在記憶體裡面

  1. background:專供背景傳輸所需的設定,類似於default ,但將於背景開啟一個新的process來處理所有工作,若要進行背景傳輸時,只能以Delegate方式支援,不能用closure

備註:以IOS app 每一個app都只有一個process,但我今天用一個background,去做一個URLSession時候,系統會在幫我開一個特殊process,這process不歸我們管,是被作業系統控管的,這process主要任務就是幫我們下載,我們的app在下載過程中User按了Home鍵,作業系統會把任務完成,任務完成後他會在把結果丟回來給我們,但是如果我們app在睡覺,這丟回來動作,會等我們醒來才處理,因為他不是多工規範的一部分

初始化URLSession實例:

在初始化一個URLSession的實例時,可以有四種情況,每一種情況處理不同的請求:

  • URLSession有一個單例shared,這個單例沒有設置會話的相關配置,可以用於基本請求。
  • 使用URLSession的初始化器,傳入會話配置對象URLSessionConfiguration.default。通過這種方式初始化的實例,類似於單例,但是這種方式可以設置一個代理,然後獲取相關數據。這種方式會把緩存保存到ROM中、把證書保存到用戶的鑰匙鏈,同時也會保存cookie。
  • 使用URLSession的初始化器,傳入會話配置對象URLSessionConfiguration. ephemeral,通過這種方式初始化的實例,類似於第二種創建方式,但是這種方式不會把緩存、證書和其他與會話相關的數據保存到ROM中,而是保存在RAM中,當會話失效後,這些數據會被自動清除。除非你自己手動保存到文件中。這種模式的優點主要是能保護用戶的隱私。
  • 使用URLSession的初始化器,傳入會話配置對象URLSessionConfiguration.background(withIdentifier: "download"),通過這種方式初始化的實例,可以支持HTTPHTTPS在後台上傳和下載文件。如果應用被系統殺死或者重新啟動,應用可以使用同一個identifier來創建一個新的會話配置對象,並獲取被系統殺死時的傳輸狀態。如果是被用戶手動終止程序,那麼系統會取消所有這個會話控制的後台傳輸,而且系統不會自動重新打開程序。只有用戶手動重新啟動應用,然後繼續下載任務。讓應用支持後台上傳和下載,還需要把會話配置對象的屬性isDiscretionary設置為true

我們也可以指定三種不同的URLSessionTask

  1. URLSessionDataTask: 一般Data下載,但不支援背景下載
  2. URLSessionUploadTask: 上傳內容用,有支援背景下載
  3. URLSessionDownloadTask:下載內容用,有支援背景下載

URLSessionTask:一個會話任務基類,下面三個是它的子類

  • URLSessionDataTask:獲取URL內容並把獲取到的內容作為Data的任務
  • URLSessionUploadTaskURLSessionDataTask的子類,一個上傳文件的任務
  • URLSessionDownloadTask:獲取URL內容並把獲取到的內容存儲到ROM的任務
  • URLSessionStreamTask:用於建立TCP/IP連接的任務

URLSessionAPI還提供了以下代理協議

  • URLSessionDelegate:定義了處理會話級別的代理方法
  • URLSessionTaskDelegate:定義了處理任務級別的代理方法
  • URLSessionDataDelegate:定義了處理數據和上傳任務級別的代理方法
  • URLSessionStreamDelegate:定義了處理流任務級別的代理方法

URLSession的使用步驟

  • 根據實際情況,創建一個會話配置URLSessionConfiguration對象
  • 創建會話URLSession對象
  • 使用會話對象創建一個任務
  • 調用任務的resume()方法,開始執行任務

生出一個session 然後把cofing 帶進去,表示我基於這個cofing,備註;session本身不是拿來做下載的人,session底下可能會有一個或多個task,這個才是真的做上傳或下載的東西,可以想像session,就是一個任務,這個任務底下可以產生好幾個工作,這工作是可以同時進行,我一次可以做多個上傳或下載,dataTask就是一個資料下載的task,這個task我可以指定你從這個url下載,下載完畢後東西就放在closure傳回來

URLSessionConfiguration 還有一些而外參數可以設定

--

--

Lin
Lin

No responses yet