在 URL session 中,一個(gè) task 代表了一次特定的請(qǐng)求,通過NSURLSession
對(duì)象的方法可以創(chuàng)建不同種類的 task。NSURLSessionTask 類是所有不同的 task 類的基類,它的子類包括
NSURLSessionDataTask
桨螺,NSURLSessionUploadTask
,NSURLSessionDownloadTask
酿秸,NSURLSessionStreamTask
灭翔。
-
NSURLSessionDataTask
將響應(yīng)內(nèi)容以NSData
對(duì)象的形式返回,不能用在 background session 中辣苏。 -
NSURLSessionUploadTask
是NSURLSessionDataTask
的子類肝箱,同樣將響應(yīng)內(nèi)容以NSData
對(duì)象的形式返回,區(qū)別是通過代理可以查看請(qǐng)求時(shí)上傳內(nèi)容的過程稀蟋,且該 task 可用在 background session 中煌张。 -
NSURLSessionDownloadTask
則是將資源以文件的形式下載到硬盤中,沒有 session 類型的限制退客。 -
NSURLSessionStreamTask
則是建立了一個(gè) TCP/IP 連接骏融。
控制 task 的狀態(tài)
task 的當(dāng)前狀態(tài)由枚舉類型NSURLSessionTaskState
的屬性 state 表示链嘀,包含以下幾種可能的值:
typedef NS_ENUM(NSInteger, NSURLSessionTaskState) {
NSURLSessionTaskStateRunning = 0,
NSURLSessionTaskStateSuspended = 1,
NSURLSessionTaskStateCanceling = 2, /*當(dāng)向task發(fā)送cancel消息后,會(huì)轉(zhuǎn)變?yōu)樵摖顟B(tài)档玻,代理會(huì)收到- URLSession:task:didCompleteWithError:消息*/
NSURLSessionTaskStateCompleted = 3, /*完成狀態(tài)不包括被取消的情況*/
};
通過NSURLSession
創(chuàng)建的 task 默認(rèn)是狀態(tài)是 suspended怀泊,調(diào)用- resume
方法后,task 的狀態(tài)變?yōu)?running窃肠。通過- suspend
方法可以將 task 重新變?yōu)閽炱馉顟B(tài)包个,當(dāng)恢復(fù) running 狀態(tài)時(shí)刷允,download task 可以從中斷的地方繼續(xù)傳輸冤留,而其他 task 都需要重新開始。當(dāng)調(diào)用- cancel
方法后树灶,task 變?yōu)?canceling 狀態(tài)纤怒,在發(fā)送給 delegate 的URLSession:task:didCompleteWithError:
消息中,error 參數(shù)的 domain 為NSURLErrorDomain
天通,code 為NSURLErrorCancelled
泊窘。
相關(guān)信息
-
originalRequest
,創(chuàng)建 task 時(shí)對(duì)應(yīng)的請(qǐng)求對(duì)象像寒。 -
currentRequest
烘豹,當(dāng)響應(yīng)為重定向到其他 URL 時(shí),該值會(huì)改變诺祸。 -
response
携悯,服務(wù)端返回的NSURLResponse
對(duì)象。 -
taskIdentifier
筷笨,NSUInteger
類型憔鬼,task 在 session 內(nèi)的唯一標(biāo)識(shí)。 -
error
胃夏,當(dāng)任務(wù)失敗時(shí)的NSError
對(duì)象轴或。 -
taskDescription
,可給任務(wù)設(shè)置一個(gè)可讀的描述仰禀,在如果需要界面展示時(shí)使用照雁。
進(jìn)度信息
-
countOfBytesExpectedToSend
,請(qǐng)求體的字節(jié)數(shù)答恶,系統(tǒng)根據(jù) header 中的 Content-Length 字段饺蚊,或者作為請(qǐng)求體的NSData
或文件的大小來設(shè)置該值。 -
countOfBytesSent
亥宿,已發(fā)送的請(qǐng)求體字節(jié)數(shù)卸勺,當(dāng)該值變化,會(huì)觸發(fā)代理方法
-URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
-
countOfBytesExpectedToReceive
烫扼,響應(yīng)體期望收到的字節(jié)數(shù)曙求,根據(jù)響應(yīng) header 中的 Content-Length 字段,若未指明,則該值為
NSURLSessionTransferSizeUnknown
(-1) -
countOfBytesReceived
悟狱,已收到的響應(yīng)體字節(jié)數(shù)静浴,當(dāng)該值變化,會(huì)觸發(fā)代理方法- URLSession:dataTask:didReceiveData:
或
URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:
優(yōu)先級(jí)
task 有一個(gè)priority
屬性挤渐,接受0到1之間的浮點(diǎn)數(shù)苹享,通過每一個(gè) task 不同的 priority 值,可以提示系統(tǒng) task 執(zhí)行的優(yōu)先級(jí)浴麻,1為最高得问,0為最低。默認(rèn)值是NSURLSessionTaskPriorityDefault
软免,即 0.5宫纬。系統(tǒng)提供了3個(gè)常量值:
NSURLSessionTaskPriorityDefault //0.5
NSURLSessionTaskPriorityLow // 0
NSURLSessionTaskPriorityHigh // 1
Task 子類
NSURLSessionDataTask
和NSURLSessionUploadTask
都沒有再實(shí)現(xiàn)額外的方法,它們只是用來區(qū)分不同的 task膏萧。而NSURLSessionDownloadTask
除了用來區(qū)分 task漓骚,還額外實(shí)現(xiàn)了一個(gè)方法- cancelByProducingResumeData:
,這個(gè)方法調(diào)用了基類NSURLSessionTask
中的- cancel
方法榛泛,參數(shù) completionHandler 要求傳入一個(gè) block蝌蹂,用來處理已傳輸?shù)臄?shù)據(jù) resume data,這個(gè) resume data 將來可用于 session 的- downloadTaskWithResumeData:
方法曹锨,以便繼續(xù)中斷的下載孤个。