在 URL session 中,一個 task 代表了一次特定的請求,通過NSURLSession
對象的方法可以創(chuàng)建不同種類的 task。NSURLSessionTask 類是所有不同的 task 類的基類,它的子類包括
NSURLSessionDataTask
,NSURLSessionUploadTask
,NSURLSessionDownloadTask
,NSURLSessionStreamTask
。
-
NSURLSessionDataTask
將響應內容以NSData
對象的形式返回,不能用在 background session 中。 -
NSURLSessionUploadTask
是NSURLSessionDataTask
的子類,同樣將響應內容以NSData
對象的形式返回,區(qū)別是通過代理可以查看請求時上傳內容的過程,且該 task 可用在 background session 中。 -
NSURLSessionDownloadTask
則是將資源以文件的形式下載到硬盤中,沒有 session 類型的限制。 -
NSURLSessionStreamTask
則是建立了一個 TCP/IP 連接。
控制 task 的狀態(tài)
task 的當前狀態(tài)由枚舉類型NSURLSessionTaskState
的屬性 state 表示,包含以下幾種可能的值:
typedef NS_ENUM(NSInteger, NSURLSessionTaskState) {
NSURLSessionTaskStateRunning = 0,
NSURLSessionTaskStateSuspended = 1,
NSURLSessionTaskStateCanceling = 2, /*當向task發(fā)送cancel消息后,會轉變?yōu)樵摖顟B(tài),代理會收到- URLSession:task:didCompleteWithError:消息*/
NSURLSessionTaskStateCompleted = 3, /*完成狀態(tài)不包括被取消的情況*/
};
通過NSURLSession
創(chuàng)建的 task 默認是狀態(tài)是 suspended,調用- resume
方法后,task 的狀態(tài)變?yōu)?running。通過- suspend
方法可以將 task 重新變?yōu)閽炱馉顟B(tài),當恢復 running 狀態(tài)時,download task 可以從中斷的地方繼續(xù)傳輸,而其他 task 都需要重新開始。當調用- cancel
方法后,task 變?yōu)?canceling 狀態(tài),在發(fā)送給 delegate 的URLSession:task:didCompleteWithError:
消息中,error 參數(shù)的 domain 為NSURLErrorDomain
,code 為NSURLErrorCancelled
。
相關信息
-
originalRequest
,創(chuàng)建 task 時對應的請求對象。 -
currentRequest
,當響應為重定向到其他 URL 時,該值會改變。 -
response
,服務端返回的NSURLResponse
對象。 -
taskIdentifier
,NSUInteger
類型,task 在 session 內的唯一標識。 -
error
,當任務失敗時的NSError
對象。 -
taskDescription
,可給任務設置一個可讀的描述,在如果需要界面展示時使用。
進度信息
-
countOfBytesExpectedToSend
,請求體的字節(jié)數(shù),系統(tǒng)根據(jù) header 中的 Content-Length 字段,或者作為請求體的NSData
或文件的大小來設置該值。 -
countOfBytesSent
,已發(fā)送的請求體字節(jié)數(shù),當該值變化,會觸發(fā)代理方法
-URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
-
countOfBytesExpectedToReceive
,響應體期望收到的字節(jié)數(shù),根據(jù)響應 header 中的 Content-Length 字段,若未指明,則該值為
NSURLSessionTransferSizeUnknown
(-1) -
countOfBytesReceived
,已收到的響應體字節(jié)數(shù),當該值變化,會觸發(fā)代理方法- URLSession:dataTask:didReceiveData:
或
URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:
優(yōu)先級
task 有一個priority
屬性,接受0到1之間的浮點數(shù),通過每一個 task 不同的 priority 值,可以提示系統(tǒng) task 執(zhí)行的優(yōu)先級,1為最高,0為最低。默認值是NSURLSessionTaskPriorityDefault
,即 0.5。系統(tǒng)提供了3個常量值:
NSURLSessionTaskPriorityDefault //0.5
NSURLSessionTaskPriorityLow // 0
NSURLSessionTaskPriorityHigh // 1
Task 子類
NSURLSessionDataTask
和NSURLSessionUploadTask
都沒有再實現(xiàn)額外的方法,它們只是用來區(qū)分不同的 task。而NSURLSessionDownloadTask
除了用來區(qū)分 task,還額外實現(xiàn)了一個方法- cancelByProducingResumeData:
,這個方法調用了基類NSURLSessionTask
中的- cancel
方法,參數(shù) completionHandler 要求傳入一個 block,用來處理已傳輸?shù)臄?shù)據(jù) resume data,這個 resume data 將來可用于 session 的- downloadTaskWithResumeData:
方法,以便繼續(xù)中斷的下載。