[iOS-Foundation] NSURLSessionTask

在 URL session 中,一個 task 代表了一次特定的請求,通過NSURLSession對象的方法可以創(chuàng)建不同種類的 task。NSURLSessionTask 類是所有不同的 task 類的基類,它的子類包括
NSURLSessionDataTaskNSURLSessionUploadTaskNSURLSessionDownloadTask,NSURLSessionStreamTask

  • NSURLSessionDataTask將響應內容以NSData對象的形式返回,不能用在 background session 中。
  • NSURLSessionUploadTaskNSURLSessionDataTask的子類,同樣將響應內容以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 子類

NSURLSessionDataTaskNSURLSessionUploadTask都沒有再實現(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ù)中斷的下載。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容