文件下載管理


1.Head請求:不獲取響應體(返回的響應沒有響應體 )只獲取響應頭 緩存

輸出參數:傳棧地址 服務器

2.null   空地址  空指針((void*)0)   0地址框架

nil  空對象((void*)0)ui

本質相同  都是0地址   混用不會出現問題  可是表達的語義不一樣url

NSNull  :對象自己不爲空   表達「空」的概念  eg:NSArray * array = @[[NSNUll null]]spa

3.下載文件用sendAsync問題:內存佔用過多  內存泄漏 崩潰線程

緣由:文件數據都加載到內存中代理

建立NSURLConnection/*請求  代理*/ 指針

代理:每次得到數據就調用/*connection;本次獲得的數據長度;總共獲得的文件長度;文件的總長度*/ 對象

4.NSURLConnectionDownloadDelegate能下載  可是不能保存文件數據 :由於沒有使用Newsstand kit 框架

dataDelegate   保存數據的時候不能用NSData進行累加  內存溢出

5.didReceiveData本次從網上獲取數據  得到二進制數據data

計算進度:文件總長度 (//數據長度的累加) 當前已經獲得的數據長度

6.保存文件到cache connectionDidFinishLoading

此時文件的全部數據都加載到內存中  致使內存溢出 

保存數據 :NSFileHandle:寫入沙盒  指定文件寫入的路徑  若是文件路徑所對應的文件不存在  該對象爲空

//建立文件 //文件已經存在  找到文件的末尾  目的是在末尾處繼續寫新的數據 //寫入數據  //關閉filehandle

7.NSStream輸出流:NSOutputStream/*文件保存的路徑;是否追加數據*/

//打開輸出流  //把數據流入文件//關閉輸出流

問題:疊加下載

解決:判斷文件是否存在(在didReciveResponse中)//NSFileManager  文件管理   存在就刪除

8.斷點續傳:

(1)//獲取服務器文件的總長度:目的是用來與本地文件的長度對比進行判斷

-(void)getServerFileInfo:(NSURL*)url{

//head請求

NSMutableURLRequest = [NSMutableURLRequest requestWithURL:url];

request.HTTPMethod = @「head」;

NSURLResponse * response;

//獲得響應頭  文件的總長度  文件名

//拼接文件保存的路徑

}

(2)判斷本地文件是否存在  返回從哪裏開始下載

//NSFileManager  文件管理   存在就刪除

if(![fileMan fileExistsAtPath:self.fileSavePath]){

return 0;

}else{

//文件存在

//獲取本地文件大小

NSDictionary * attrs = [fileMan attributesOfItemAtPath:self.fileSavePath error:NULL];

}

不存在:從0開始下載    存在:獲得本地文件的長度做比較:a.本地文件的長度==服務器文件的長度    下載完成

b.本地文件的長度 < 服務器文件的長度  沒有下載完成  從文件的末尾接着下載

c.本地文件的長度>服務器文件的長度  文件有問題  刪除文件  從0開始下載

(3)從服務器的中間節點開始下載  告訴服務器從哪一個地方開始下載

/*語法:

Range:bytes = x-  從x處下載到文件末尾

Range:bytes = -y  從頭下載到y處

Range:bytes = x - y 從x下載到y處

*/

9.//建立NSURLConnection

//子線程的消息循環默認不運行  NSURLConnection依賴消息循環   手動開啓子線程的消息循環

//爲了方便vc在文件下載完成的時候進行ui操做   在主線程添加隊列   線程間通訊

10.當屢次調用下載方法的時候  每點擊一次 就會開啓下載   點擊屢次就會開啓多個下載  進度progress都是經過progressBlock回調回vc

11.//管理downloader  判斷是否已經開啓了下載   若是已經開啓了  就return

//經理須要提供給vc下載和暫停操做   經過經理的統一指揮  調用員工downloader

//單例+(instance)sharedManager

12.下載:

//攔截

//調用vc傳過來的block代碼

//刪除操做緩存

//操做緩存:目的是用來存儲正在運行的下載操做

//把下載操做加入到操做緩存中

13.暫停:從操做緩存中取到對應的操做

//取消

//刪除緩存操做

14.用NSOperation改寫    main方法  須要咱們本身指定  未來經過操做隊列的調度  會在一個子線程運行

相關文章
相關標籤/搜索