Swift 示範如何客製化元件,圖片下載套件(2)串上http Get 作法, URLSessionConfiguration基本觀念
這邊示範必較新的Apple關於web service URLSession這個元件
URLConnection的後繼者 URLSession
URLSession
類原生支持data
、file
、ftp
、http
和https
協議。跟它比較相關的另外一個類是URLSessionConfiguration
,這個類可以用來設置會話的相關配置,在初始化會話實例時,有可能會用到。
- 可進行更詳細設定
- 可以對上傳或下載的工作去取消,暫停,繼續,等等的操作
- 可以在App在背景的時候,持續的上傳或下載
- 可以支援Delegate 或 closure 進行互動(這邊範例使用closure,下載之後的結果會從closure回來)
透過指定URLSessionConfiguration的參數,可以指定以下的三大類使用
- default: 預設的設定,類似於URLConnection的運作模式,傳輸的資量大時,將於內部儲存空間暫停
備註:default跟傳統URLconnectione功能幾乎一模一樣,也就是說你任務是要負責改寫把原本URLconnectione改成URLSession,這時候你就可以選擇Default,他是拿來替換基本型的Configuration,這個Configuration會有個特性,我今天下載是很大的檔案,比如說我下載一個500m大檔,基本上我不可能把500m都放在記憶體裡面,很多iphone手機1G的記憶體,以default這個Configuration來說,當他發現這下載東西很大的時候,他會幫我們存在硬碟裡面做暫存,他不會傻傻傻全都靠記憶體堆積起來
- ephemeral:專供臨時傳輸所需的設定,小量傳輸資料用,所有東西都會儲存於記憶體中,當App結束Session時,所有的資訊都會消失,他不會暫存在硬碟
備註ephemeral: 假設我今天有一些下載任務,資料不會太大,一下就下載好了,下載之後,我沒有要做快取,保存這些需求就可選擇ephemeral,他所有東西都會存在記憶體裡面
- 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")
,通過這種方式初始化的實例,可以支持HTTP
和HTTPS
在後台上傳和下載文件。如果應用被系統殺死或者重新啟動,應用可以使用同一個identifier
來創建一個新的會話配置對象,並獲取被系統殺死時的傳輸狀態。如果是被用戶手動終止程序,那麼系統會取消所有這個會話控制的後台傳輸,而且系統不會自動重新打開程序。只有用戶手動重新啟動應用,然後繼續下載任務。讓應用支持後台上傳和下載,還需要把會話配置對象的屬性isDiscretionary
設置為true
。
我們也可以指定三種不同的URLSessionTask
- URLSessionDataTask: 一般Data下載,但不支援背景下載
- URLSessionUploadTask: 上傳內容用,有支援背景下載
- URLSessionDownloadTask:下載內容用,有支援背景下載
URLSessionTask
:一個會話任務基類,下面三個是它的子類
URLSessionDataTask
:獲取URL內容並把獲取到的內容作為Data
的任務URLSessionUploadTask
:URLSessionDataTask
的子類,一個上傳文件的任務URLSessionDownloadTask
:獲取URL內容並把獲取到的內容存儲到ROM的任務URLSessionStreamTask
:用於建立TCP/IP連接的任務
URLSession
API還提供了以下代理協議
URLSessionDelegate
:定義了處理會話級別的代理方法URLSessionTaskDelegate
:定義了處理任務級別的代理方法URLSessionDataDelegate
:定義了處理數據和上傳任務級別的代理方法URLSessionStreamDelegate
:定義了處理流任務級別的代理方法
URLSession
的使用步驟
- 根據實際情況,創建一個會話配置
URLSessionConfiguration
對象 - 創建會話
URLSession
對象 - 使用會話對象創建一個任務
- 調用任務的
resume()
方法,開始執行任務
生出一個session 然後把cofing 帶進去,表示我基於這個cofing,備註;session本身不是拿來做下載的人,session底下可能會有一個或多個task,這個才是真的做上傳或下載的東西,可以想像session,就是一個任務,這個任務底下可以產生好幾個工作,這工作是可以同時進行,我一次可以做多個上傳或下載,dataTask就是一個資料下載的task,這個task我可以指定你從這個url下載,下載完畢後東西就放在closure傳回來
URLSessionConfiguration 還有一些而外參數可以設定