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方法 須要咱們本身指定 未來經過操做隊列的調度 會在一個子線程運行