斷點續(xù)傳

1.斷點續(xù)傳

定義:我們有時在邊聊天邊下載大文件時净神,感覺很卡蔫饰,這時可以暫停下載任務(wù)酌呆,聊完天再繼續(xù)下載文件疗锐。這就是斷點下載

實現(xiàn)方式:iOS中利用NSURLSession可以進(jìn)行文件斷點下載坊谁,下面就一起來實現(xiàn)它吧。

知識儲備:1.對NSURLSesiion的認(rèn)識

NSURLSesiion是蘋果在iOS7推出的一個類滑臊,它具備了NSURLConnection所具備的方法口芍,同時也比它更強大。蘋果推出它的目的大有取代NSURLConnection的趨勢或者目的雇卷。

2.NSURLSesiion的作用

實現(xiàn)對文件的下載與上傳鬓椭。在NSURLSesiion中颠猴,任何請求都可以被看做是一個任務(wù)。而NSURLSesiionData有兩個子類:NSURLSessionDownlaodTask實現(xiàn)文件下載和NSURLSessionUploadTask實現(xiàn)文件上傳小染。

3.NSURLSession的獲取

NSURLSession的獲取可以用NSURLSessionDownloadTaskdelegate的方法獲取翘瓮,但是必須得遵循這個協(xié)議。獲取如下:

NSURLSessionDonfiguration*configuration=[NSURLSessionDonfiguration defaultSessionconfiguration];

self.session=[NsURLSessionsessionWithConfiguration:NSURLSessionDonfiguration delegate: self?delegateQueue:[NSOperationQueue mainQueue]];

4.下載任務(wù)的創(chuàng)建

NSURLSessionDownlaodTask* task=[self.sessiondownloadTaskWithURL:url]

5.NSURLSessionDownloadDelegate的代理方法:

它有三個方法:

6.沙盒路徑的獲取

NSString*path=[NSSearchPathForDiretoriesInDomains(NSDocumentDirectoriy,NSUserDomainMask, YES ) ?lastObject];

7.caches路徑的獲取及里面文件名的創(chuàng)建

NSString *caches=[NSSearchPathForDiretoriesInDomains(NSCachesDirectoriy,NSUserDomainMask, YES ) ?lastObject];

NSString* filename=[cachesstringByAppendingPathComponent:downloadTask.response.suggestedname];

第二部分對程序幾個屬性的說明

1.resumeData

該參數(shù)包含了繼續(xù)下載文件的位置信息裤翩。也就是說资盅,當(dāng)你下載了10M得文件數(shù)據(jù),暫停了踊赠。那么你下次繼續(xù)下載的時候是從第10M這個位置開始的呵扛,而不是從文件最開始的位置開始下載。因而為了保存這些信息筐带,所以才定義了這個NSData類型的這個屬性:resumeData

2. ?task

該參數(shù)的類型是NSURLSessionDownloadTask今穿。因為在程序調(diào)用暫停(pause)這個方法時,必須擁有這個屬性伦籍,怎么拿到它了荣赶?最好的辦法就是讓控制器擁有這個屬性。

3. session

該參數(shù)的類型是NSURLSession.在程序調(diào)用繼續(xù)下載(resume)這個方法時鸽斟,必須擁有這個session拔创。因為之前的任務(wù)task被取消了,無法在復(fù)用了富蓄,所以用懶加載的方法剩燥,讓session只創(chuàng)建一次,同時也讓控制器擁有了這個屬性立倍。


*使用NSURLSessionDataTask可以很輕松實現(xiàn)斷點續(xù)傳灭红,可是有個致命的缺點就是無法進(jìn)行后臺下載

二:對NSURLSessionDownloadTask解釋

? ? ? ? 使用NSURLSessionDataTask可以很輕松實現(xiàn)斷點續(xù)傳,可是有個致命的缺點就是無法進(jìn)行后臺下載口注,一點應(yīng)用程序進(jìn)入了后臺变擒,便會停止下載。所以無法滿足我們的需求寝志。而NSURLSessionDownloadTask是唯一可以實現(xiàn)后臺下載的類娇斑,所以我們只能從這個類進(jìn)行下手了。

那么本篇我們就來談?wù)勱P(guān)于應(yīng)用程序隨時可能被殺死的情況下材部,如何進(jìn)行斷點續(xù)傳毫缆。

(一):關(guān)于斷點續(xù)傳原理:

首先,如果想要進(jìn)行斷點續(xù)傳,那么需要簡單了解一下斷點續(xù)傳的工作機制乐导,在HTTP請求頭中苦丁,有一個Range的關(guān)鍵字,通過這個關(guān)鍵字可以告訴服務(wù)器返回哪些數(shù)據(jù)給我物臂。

比如:

bytes=500-999 表示第500-第999字節(jié)

bytes=500- 表示從第500字節(jié)往后的所有字節(jié)

然后我們再根據(jù)服務(wù)器返回的數(shù)據(jù)旺拉,將得到的data數(shù)據(jù)拼接到文件后面,就可以實現(xiàn)斷點續(xù)傳了产上。

(二):關(guān)于文件下載與暫停的分析:

1.當(dāng)使用NSURLSessionDownloadTask進(jìn)行下載的時候,系統(tǒng)會在cache文件夾下創(chuàng)建一個下載的路徑.(路徑下會有一個以"CFNetworking"打頭的.tmp文件(以下簡稱"下載文件"防止混淆),這個就是我們正在下載中的文件)

2.調(diào)用cancelByProducingResumeData:方法后,會得到一個data文件,通過String格式化后蛾狗,發(fā)現(xiàn)是一個XML文件.

3.XML里面包含了關(guān)于.tmp文件的一些關(guān)鍵點的描述,包括"Range","key","下載文件的路徑"等等.而原本存在于download文件下的下載文件蒂秘,則被移動到了系統(tǒng)tmp文件夾目錄下.

4.當(dāng)我們再次進(jìn)行resume操作的時候,下載文件則又被移回到了download文件夾下淘太。


(三):關(guān)于程序被殺掉的斷點續(xù)傳resumeData

根據(jù)上面的分析,基本可以得到以下結(jié)論:

1.DownloadTask每次進(jìn)行斷點續(xù)傳的時候,會根據(jù)data文件中的"路徑Key"去尋找下載文件,然后校驗后再根據(jù)"Range"屬性去進(jìn)行斷點續(xù)傳姻僧。

2.download文件夾中存放的只會是下載中的文件,一旦暫停就會被移動到tmp文件夾下。

3.每個暫停得到的data文件蒲牧,與下載文件一一對應(yīng)撇贺。

3.斷點續(xù)傳只與tmp文件夾中的文件有關(guān)。

具體實現(xiàn)

為了節(jié)省性能冰抢,我嘗試查找關(guān)于程序被殺掉前的回調(diào),但是很遺憾失敗了松嘶,因為我無法控制到知道是哪一秒去保存進(jìn)度,所以我只能每隔一段時間保存一次。設(shè)置一個Bool變量用來判斷是否正在下載中,同時用一個周期事件每隔一段時間暫停一次(聽上去挺笨的挎扰,但是這似乎是唯一獲得data文件的辦法了)翠订。然后保存data文件和拷貝tmp文件夾下的下載文件到安全目錄下(因為tmp文件夾據(jù)說隨時可能清空)。

當(dāng)再次下載的時候遵倦,先是從安全目錄下取到下載文件尽超,刪除tmp文件夾中原有的同名文件,然后copy到tmp目錄下梧躺,最后利用保存的data文件進(jìn)行再次downloadTaskWithResumeData操作似谁,就可以實現(xiàn)再次下載了。

利與弊

好處:

1.DownloadTask可以后臺下載掠哥,不必保持app在前臺巩踏,用戶體驗很好。

2.實現(xiàn)了任意時間點殺掉進(jìn)程后续搀,仍然可以斷點續(xù)傳塞琼。

缺陷:

1.因為蘋果沒有提供很好的API,所以會有一個循環(huán)檢查禁舷,每隔一段時間會暫停個一秒左右,效率略有降低彪杉。

2.如果設(shè)置保存間隔過長,中間殺掉進(jìn)程可能會損失較多進(jìn)度榛了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末在讶,一起剝皮案震驚了整個濱河市煞抬,隨后出現(xiàn)的幾起案子霜大,更是在濱河造成了極大的恐慌,老刑警劉巖革答,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件战坤,死亡現(xiàn)場離奇詭異曙强,居然都是意外死亡,警方通過查閱死者的電腦和手機途茫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門碟嘴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人囊卜,你說我怎么就攤上這事娜扇。” “怎么了栅组?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵雀瓢,是天一觀的道長。 經(jīng)常有香客問我玉掸,道長刃麸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任司浪,我火速辦了婚禮泊业,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啊易。我一直安慰自己吁伺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布租谈。 她就那樣靜靜地躺著箱蝠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垦垂。 梳的紋絲不亂的頭發(fā)上宦搬,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音劫拗,去河邊找鬼间校。 笑死,一個胖子當(dāng)著我的面吹牛页慷,可吹牛的內(nèi)容都是我干的憔足。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼酒繁,長吁一口氣:“原來是場噩夢啊……” “哼滓彰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起州袒,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤揭绑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體他匪,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡菇存,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了邦蜜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片依鸥。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悼沈,靈堂內(nèi)的尸體忽然破棺而出贱迟,到底是詐尸還是另有隱情,我是刑警寧澤絮供,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布关筒,位于F島的核電站,受9級特大地震影響杯缺,放射性物質(zhì)發(fā)生泄漏蒸播。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一萍肆、第九天 我趴在偏房一處隱蔽的房頂上張望袍榆。 院中可真熱鬧,春花似錦塘揣、人聲如沸包雀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽才写。三九已至,卻和暖如春奖蔓,著一層夾襖步出監(jiān)牢的瞬間赞草,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工吆鹤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厨疙,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓疑务,卻偏偏與公主長得像沾凄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子知允,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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