多任務下載

? ? ? ? 最近想封裝一個多任務斷點下載供項目使用,想?yún)⒖季W(wǎng)上是否有好的案例振惰,幾乎所有的下載相關都看了大同小異但是都不是很滿意歌溉,唯獨有個swift的demo引起了我的注意,有需要的可以查看Tiercel骑晶,但是該demo是純swift開發(fā)痛垛,iOS想使用需要橋接草慧,為了盡量減少混合代碼,想自己圍繞該demo樣式寫一份純OC示例榜晦,目前demo尚未全部完成冠蒋,后續(xù)會持續(xù)更新ZWDownload。以下附demo原型:


以下是著重講解項目中需要注意的點乾胶,當你了解這些點后抖剿,只要時間充足,你也能封裝一個理想的多任務下載管理器:
1.所需下載資源的總大惺读:
? ? ? ? 資源大小的生成方式有2種斩郎,第一種也是最簡單的當然是獲取下載資源的同時讓服務端告知總資源的大小喻频;第二種可以在創(chuàng)建任務的時候先建立task缩宜,在獲取資源反饋的時候進行掛起,這樣就能獲取每個資源的詳細信息(包括大猩隆)锻煌,累計所有待下載的資源的大小姻蚓;

2.進度:
? ? ? ? 進度分為單任務進度和多任務進度:
? ??????1).單任務進度:也是我們下載中最常見的下載的文件占當前網(wǎng)絡資源大小的百分比宋梧;
? ? ? ? 2).多任務進度:
? ? ? ? ? ? ? ? ? 第一種也是之前見過最多的,當一個資源下載完成后進度加多少狰挡,這樣存在的弊端? ? ? ? ? ? ?就是當文件的大小存在嚴重差異的時候捂龄,或者網(wǎng)絡不穩(wěn)定時候會存在卡在某個百分比進? ? ? ? ? ? 度,這也是很不人性化的加叁;
? ? ? ? ? ? ? ? ?第二種方式比較人性化倦沧,但是存在諸多計算消耗,視自己需要它匕≌谷冢可以當每獲取一個? ? ? ? ? ? 下載片段的時候便更新總的已下載文件大小(獲取大小這不用介紹了吧)豫柬,然后根據(jù)總? ? ? ? ? ? 的大小進行計算告希,這時候的進度是非常準確的。
備注:如果想像上面一樣轮傍,按照KB、M這種方式顯示進度為啥不用+ (NSString *)stringFromByteCount:(long long)byteCount countStyle:(NSByteCountFormatterCountStyle)countStyle試試呢首装?

3.下載速度:
? ? ? ? 下載速度是個取舍問題创夜,我們可以在每次更新下載片段的時候計算出時間差與片段的大小,這樣能精確的計算出下載速度仙逻,憑借定時器每秒獲取一次速度就行驰吓,但是這確實太沒趣了涧尿,做了很多沒必要的計算,如果我本來就不需要下載進度是不是多計算了很多檬贰?
? ? ? ? 合理的方式應該是設置是否需要下載速度開關姑廉,如果需要,每秒更新之前已下載大小與目前更新大形痰印(不要用NSTimer桥言,你懂的),然后計算葵礼,如果覺得這算0.5秒前的速度不滿意号阿,你也可以將時間縮短,也就是越準確你計算的越多鸳粉,還要做成每秒取一次操作扔涧,當然用戶也不會糾結(jié)這點精度。

4.剩余時間:
? ? ? ? 剩余時間是一個附加邏輯届谈,當你能計算出總的下載速度的時候枯夜,通過總的資源大小可以很簡單的計算出;

5.最大并發(fā)數(shù)量:
? ? ? ? 最大并發(fā)數(shù)可以手動控制最大并發(fā)的數(shù)量艰山。目前iPhone的處理器是多核(2個湖雹、4個),適當?shù)牟l(fā)可以提高效率程剥,但是無節(jié)制地并發(fā)劝枣,如將大量任務不加思索就用并發(fā)隊列來執(zhí)行,這只會大量增加線程數(shù)织鲸,搶占CPU資源舔腾,甚至會擠占掉主線程的 CPU 資源(極端情況)為此我們很有必要自己設置最大并發(fā)數(shù)量。設置并發(fā)數(shù)量最常用的方式就是使用信號量來控制搂擦。由于任務可以動態(tài)操作稳诚,所以這里可以使用隊列或者數(shù)組進行手動控制。

6.斷點續(xù)傳:
? ? ? ? 斷點續(xù)傳就比較簡單了瀑踢,只需要實時記錄下載鏈接對應的本地文件位置與已下載大小扳还,當重新打算下載的時候通過以下方法繼續(xù)下載之前未下載完的資源。
NSString *range = [NSString stringWithFormat:@"bytes=%zd-",self.currentSize];
[request setValue:range forHTTPHeaderField:@"Range"];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末橱夭,一起剝皮案震驚了整個濱河市氨距,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棘劣,老刑警劉巖俏让,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡首昔,警方通過查閱死者的電腦和手機寡喝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勒奇,“玉大人预鬓,你說我怎么就攤上這事∩薜撸” “怎么了格二?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巨税。 經(jīng)常有香客問我蟋定,道長,這世上最難降的妖魔是什么草添? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任驶兜,我火速辦了婚禮,結(jié)果婚禮上远寸,老公的妹妹穿的比我還像新娘抄淑。我一直安慰自己,他們只是感情好驰后,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布肆资。 她就那樣靜靜地躺著,像睡著了一般灶芝。 火紅的嫁衣襯著肌膚如雪郑原。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天夜涕,我揣著相機與錄音犯犁,去河邊找鬼。 笑死女器,一個胖子當著我的面吹牛酸役,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驾胆,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涣澡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丧诺?” 一聲冷哼從身側(cè)響起入桂,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驳阎,沒想到半個月后抗愁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惕艳,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年驹愚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劣纲。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡逢捺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癞季,到底是詐尸還是另有隱情劫瞳,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布绷柒,位于F島的核電站志于,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏废睦。R本人自食惡果不足惜伺绽,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗜湃。 院中可真熱鬧奈应,春花似錦、人聲如沸购披。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刚陡。三九已至惩妇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筐乳,已是汗流浹背歌殃。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哥童,地道東北人挺份。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像贮懈,于是被迫代替她去往敵國和親匀泊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354