自定義NSOperation利用NSURLSession胚泌、NSOperationQueue實現(xiàn)多線程斷點下載(1)

之一

代碼Demo

Github:SYDownloadManager

NSOperationQueue可以方便的實現(xiàn)多任務(wù)的處理,對于簡單的多任務(wù)使用NSBlockOperation和NSInvocationOperation即可很好的處理。但是對于復(fù)雜的多任務(wù)该互,比如使用NSURLSession實現(xiàn)下載欲低,使用NSOperationQueue對下載任務(wù)進(jìn)行辕宏、開始、暫停砾莱、重啟瑞筐、取消以及進(jìn)度等的操作時,卻感覺無從下手腊瑟【奂伲總覺得NSBlockOperation和NSInvocationOperation這兩個operation干的是一錘子買賣块蚌,就是將下載任務(wù)扔到block中或者selector中等待Queue的自動調(diào)度,不用進(jìn)行進(jìn)度監(jiān)控膘格,和暫停重啟等操作峭范。為學(xué)習(xí)多線程,解決心中的疑惑瘪贱,特意結(jié)合以前所知所得虎敦,實現(xiàn)了該功能,并記錄下來政敢,讓大家少踩一些坑其徙。

1.斷點下載實現(xiàn)原理

利用http請求頭 range:bytes=start-end 實現(xiàn)

2.對NSURLSession、NSURLSessionDataTask和NSOperation喷户、NSOperationQueue核心點的理解

首先應(yīng)該對Queue自動調(diào)度Operation有一個初步的了解唾那;每一個Operation有ready(準(zhǔn)備狀態(tài))、executing(運行狀態(tài))褪尝、cancled(取消狀態(tài))闹获、finished(結(jié)束狀態(tài))等狀態(tài)。

其中ready是Queue調(diào)用addOperation:后Operation的狀態(tài)河哑,表明該Operation可以被Queue自動調(diào)度避诽,當(dāng)合適的時機時Operation的start方法會被調(diào)用,Operation會處于executing ==yes的狀態(tài)璃谨,切記ready狀態(tài)是個坑點I陈!<淹獭拱雏!

Queue如何獲取合適的時機呢?底扳?原來Queue是通過KVO來獲知Operation的狀態(tài)铸抑,當(dāng)Operation處于ready時且operationCount小于maxConcurrentOperationCount,就自動調(diào)用該Operation的start方法衷模,讓這個任務(wù)開始運行鹊汛。

finished狀態(tài)是表明該Operation已經(jīng)結(jié)束,Queue獲取了這個Operation的Finished==YES時阱冶,會自動的將該Operation從Queue的隊列中移除刁憋。這個finished也是個關(guān)鍵點。

其次熙揍,對NSURLSession和NSURLSessionTask的認(rèn)知职祷;一個Session可以個維持若干個Task氏涩,Session可以通過回調(diào)知道每個task的運行情況比如task的進(jìn)度届囚,結(jié)束后的緩存路徑等有梆;而task的開啟(resume)、暫停(suspend)意系、重啟(resume)是由自身來控制泥耀,且task保留她的這些狀態(tài)。

這時就可以看到一個共同的相似點蛔添,Queue管理Operation痰催,Session管理Task;Queue通過KVO獲知Operation的狀態(tài)迎瞧,Session可以通過代理獲知task的狀態(tài)夸溶。因此,可以把Task和Operation結(jié)合(自定義Operation)凶硅,實現(xiàn)下載任務(wù)的手動開啟暫停重啟等缝裁,通過Session的回調(diào)獲知task的進(jìn)度,通過Queue自動調(diào)度TaskOperation足绅;?

3.如何自定義NSOperation

1.要可以下載捷绑;TaskOperation有一個NSURLSessionDataTask的屬性

2.Queue可以自動開始下載;在TaskOperation中重寫start方法氢妈,并且啟動【dataTask resume】

3.Queue可以獲知TaskOperation的下載完成和finished==YES狀態(tài)粹污,可以在合適的時機自動調(diào)用另一個TaskOperation的start方法,又首量,dataTask并不能獲知自己是否下載完畢壮吩,所以需要暴露一個completionTask的方法;注意這里finished==yes加缘,且使用KVO

4.cancle方法的重寫粥航,在這里記得取消下載任務(wù)


5.其他暴露的方法,很清晰生百。注意每次不論開始還是重啟新建一個TaskOperation就可以了递雀。。問我為什么蚀浆?一個是因為斷點的缀程,一個是Queue是會自動移除Operation的

以上自定義NSOperation就完成了,很簡單

4.如何實現(xiàn)TaskOperation的調(diào)度市俊?杨凑??

沒有實現(xiàn)一說摆昧,是自動調(diào)度的撩满,只用設(shè)置最大并發(fā)數(shù)并將TaskOperation添加到Queue中就行了,只用記著在Session的Task完成的回調(diào)中調(diào)用該【TaskOperation completionTask】就行了

SYDownloadTaskManager的一些方法

?下載任務(wù)完成的回調(diào)處理

后續(xù):之二

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伺帘,隨后出現(xiàn)的幾起案子昭躺,更是在濱河造成了極大的恐慌,老刑警劉巖伪嫁,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件领炫,死亡現(xiàn)場離奇詭異,居然都是意外死亡张咳,警方通過查閱死者的電腦和手機帝洪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脚猾,“玉大人葱峡,你說我怎么就攤上這事×” “怎么了族沃?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泌参。 經(jīng)常有香客問我脆淹,道長,這世上最難降的妖魔是什么沽一? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任盖溺,我火速辦了婚禮,結(jié)果婚禮上铣缠,老公的妹妹穿的比我還像新娘烘嘱。我一直安慰自己,他們只是感情好蝗蛙,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布蝇庭。 她就那樣靜靜地躺著,像睡著了一般捡硅。 火紅的嫁衣襯著肌膚如雪哮内。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天壮韭,我揣著相機與錄音北发,去河邊找鬼。 笑死喷屋,一個胖子當(dāng)著我的面吹牛琳拨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屯曹,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狱庇,長吁一口氣:“原來是場噩夢啊……” “哼惊畏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起密任,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颜启,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后批什,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體农曲,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡社搅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年驻债,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片形葬。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡合呐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笙以,到底是詐尸還是另有隱情淌实,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布猖腕,位于F島的核電站拆祈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倘感。R本人自食惡果不足惜放坏,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望老玛。 院中可真熱鬧淤年,春花似錦、人聲如沸蜡豹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镜廉。三九已至弄诲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娇唯,已是汗流浹背威根。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留视乐,地道東北人洛搀。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像佑淀,于是被迫代替她去往敵國和親留美。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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