iOS中利用NSURLSession進行文件斷點下載
我們有時在邊聊天邊下載大文件時,感覺很卡,這時可以暫停下載任務,聊完天再繼續下載文件。這就是斷點下載。iOS中利用NSURLSession可以進行文件斷點下載,下面就一起來實現它把!! 1.對NSURLSesiion的認識
第一部分 知識儲備
NSURLSesiion是蘋果在iOS7推出的一個類,它具備了NSURLConnection所具備的方法,同時也比它更強大。蘋果推出它的目的大有取代NSURLConnection的趨勢或者目的。
2. NSURLSesiion的作用
實現對文件的下載與上傳。在NSURLSesiion中,任何請求都可以被看做是一個任務。而NSURLSesiionData 有兩個子類:NSURLSessionDownlaodTask實現文件下載和NSURLSessionUploadTask實現文件上傳。
3.NSURLSession的獲取
NSURLSession的獲取可以用NSURLSessionDownloadTaskdelegate的方法獲取,但是必須得遵循這個協議。獲取如下:
NSURLSessionDonfiguration* configuration=[NSURLSessionDonfiguration defaultSessionconfiguration];
self.session=[NsURLSession sessionWithConfiguration:NSURLSessionDonfiguration delegate: self delegateQueue:[NSOperationQueue mainQueue]];
4.下載任務的創建
NSURLSessionDownlaodTask* task=[self.session downloadTaskWithURL:url]
5.NSURLSessionTaskdelegate的代理方法:
它有三個方法:
6. 沙盒路徑的獲取
NSString *path=[NSSearchPathForDiretoriesInDomains(NSDocumentDirectoriy, NSUserDomainMask, YES ) lastObject];
7.caches路徑的獲取及里面文件名的創建
NSString *caches=[NSSearchPathForDiretoriesInDomains(NSCachesDirectoriy, NSUserDomainMask, YES ) lastObject];
NSString* filename=[caches stringByAppendingPathComponent:downloadTask.response.suggestedname];
第二部分 對程序幾個屬性的說明
1. resumeData
該參數包含了繼續下載文件的位置信息。也就是說,當你下載了10M得文件數據,暫停了。那么你下次繼續下載的時候是從第10M這個位置開始的,而不是從文件最開始的位置開始下載。因而為了保存這些信息,所以才定義了這個NSData類型的這個屬性:resumeData
2. task
該參數的類型是NSURLSessionDownloadTask。因為在程序調用暫停(pause)這個方法時,必須擁有這個屬性,怎么拿到它了?最好的辦法就是讓控制器擁有這個屬性。
3. session
該參數的類型是NSURLSession.在程序調用繼續下載(resume)這個方法時,必須擁有這個session。因為之前的任務task被取消 了,無法在復用了,所以用懶加載的方法,讓session只創建一次,同時也讓控制器擁有了這個屬性。
第三部分 程序實現流程(偽代碼)
下面是文件下載的思路:
第四部分 UI界面搭建
由于程序UI界面搭建十分容易,故在此不詳細敘述。
第五部分 程序特別注意點
1. 在調用pause這個方法時,存在著一定的風險,因為self對task進行了強引用,task又對block進行了引用,block又對self進行引用,這就形成了循環使用。怎么解決這個問題呢?
解決方法:對self進行弱引用 __weak typedef(self) vc=self
2. 如果設置了completion和block,又實現了代理方法,程序優先執行block
第六部分 代碼截圖
第七部分 程序截圖
</span>