iOS中利用NSURLSession進行文件斷點下載

jopen 9年前發布 | 20K 次閱讀 IOS iOS開發 移動開發

我們有時在邊聊天邊下載大文件時,感覺很卡,這時可以暫停下載任務,聊完天再繼續下載文件。這就是斷點下載。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的代理方法:

    它有三個方法:

iOS中利用NSURLSession進行文件斷點下載

 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只創建一次,同時也讓控制器擁有了這個屬性。

                             第三部分 程序實現流程(偽代碼)

下面是文件下載的思路:


                        iOS中利用NSURLSession進行文件斷點下載

   

                                      第四部分 UI界面搭建

          

                   由于程序UI界面搭建十分容易,故在此不詳細敘述。


                                      第五部分  程序特別注意點

1.  在調用pause這個方法時,存在著一定的風險,因為self對task進行了強引用,task又對block進行了引用,block又對self進行引用,這就形成了循環使用。怎么解決這個問題呢?

解決方法:對self進行弱引用 __weak typedef(self)   vc=self

2. 如果設置了completion和block,又實現了代理方法,程序優先執行block

                                      第六部分 代碼截圖

iOS中利用NSURLSession進行文件斷點下載

iOS中利用NSURLSession進行文件斷點下載

iOS中利用NSURLSession進行文件斷點下載

iOS中利用NSURLSession進行文件斷點下載


                                      第七部分   程序截圖


iOS中利用NSURLSession進行文件斷點下載

iOS中利用NSURLSession進行文件斷點下載

iOS中利用NSURLSession進行文件斷點下載

iOS中利用NSURLSession進行文件斷點下載

iOS中利用NSURLSession進行文件斷點下載

iOS中利用NSURLSession進行文件斷點下載

iOS中利用NSURLSession進行文件斷點下載


</span>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!