[iOS-Foundation] NSURLSessionTask

在 URL session 中,一個(gè) task 代表了一次特定的請(qǐng)求,通過NSURLSession對(duì)象的方法可以創(chuàng)建不同種類的 task。NSURLSessionTask 類是所有不同的 task 類的基類,它的子類包括
NSURLSessionDataTask桨螺,NSURLSessionUploadTaskNSURLSessionDownloadTask酿秸,NSURLSessionStreamTask灭翔。

  • NSURLSessionDataTask將響應(yīng)內(nèi)容以NSData對(duì)象的形式返回,不能用在 background session 中辣苏。
  • NSURLSessionUploadTaskNSURLSessionDataTask的子類肝箱,同樣將響應(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 子類

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市艘希,隨后出現(xiàn)的幾起案子硼身,更是在濱河造成了極大的恐慌,老刑警劉巖覆享,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佳遂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撒顿,警方通過查閱死者的電腦和手機(jī)丑罪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凤壁,“玉大人吩屹,你說我怎么就攤上這事∨《叮” “怎么了煤搜?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)唧席。 經(jīng)常有香客問我擦盾,道長(zhǎng)嘲驾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任迹卢,我火速辦了婚禮辽故,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腐碱。我一直安慰自己誊垢,他們只是感情好台颠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布京景。 她就那樣靜靜地躺著聋庵,像睡著了一般宏胯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缓溅,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天砸讳,我揣著相機(jī)與錄音,去河邊找鬼瓷们。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秒咐,可吹牛的內(nèi)容都是我干的谬晕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼携取,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼攒钳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雷滋,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤不撑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后晤斩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焕檬,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年澳泵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了实愚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兔辅,死狀恐怖腊敲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情维苔,我是刑警寧澤碰辅,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站介时,受9級(jí)特大地震影響没宾,放射性物質(zhì)發(fā)生泄漏忍法。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一榕吼、第九天 我趴在偏房一處隱蔽的房頂上張望饿序。 院中可真熱鬧,春花似錦羹蚣、人聲如沸原探。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咽弦。三九已至,卻和暖如春胁出,著一層夾襖步出監(jiān)牢的瞬間型型,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工全蝶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闹蒜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓抑淫,卻偏偏與公主長(zhǎng)得像绷落,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子始苇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容