關(guān)于下載問題,在前面講解NSURLConnection實(shí)現(xiàn)文件下載時(shí),使用block回調(diào)我們會(huì)遇到內(nèi)存猛增以及無法獲取下載進(jìn)度的問題,最終、我們可以通過設(shè)置代理來獲取進(jìn)度信息和邊下邊寫數(shù)據(jù)來解決以上問題。iOS 9以后,蘋果棄用NSURLConnection發(fā)起網(wǎng)絡(luò)請(qǐng)求,取而代之的是NSURLSession。NSURLSession中的相應(yīng)方法已經(jīng)做到了邊下邊寫數(shù)據(jù)。這篇我們先說一說通過block回調(diào)來實(shí)現(xiàn)文件下載的方法:
注意:
與CAAnimation、NSOperation一樣,NSURLSessionTask也是抽象類,不具備操作的能力,使用過程中只能使用其子類:
NSURLSessionTask.png
NSURLSessionDownloadTask回調(diào)實(shí)現(xiàn)文件下載
//優(yōu)點(diǎn):不需要擔(dān)心內(nèi)存
//缺點(diǎn):無法監(jiān)聽文件下載進(jìn)度
-(void)download
{
//1.url
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_03.png"];
//2.創(chuàng)建請(qǐng)求對(duì)象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.創(chuàng)建session
NSURLSession *session = [NSURLSession sharedSession];
//4.創(chuàng)建Task
/*
第一個(gè)參數(shù):請(qǐng)求對(duì)象
第二個(gè)參數(shù):completionHandler 回調(diào)
location:臨時(shí)存放路徑 NSURL類型,遵循file://協(xié)議
response:響應(yīng)頭信息
error:錯(cuò)誤信息
*/
//該方法內(nèi)部已經(jīng)實(shí)現(xiàn)了邊接受數(shù)據(jù)邊寫沙盒(tmp)的操作
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//6.處理數(shù)據(jù) block所在線程為子線程
NSLog(@"%@---%@",location,[NSThread currentThread]);
//6.1 拼接文件全路徑 : 保存在tmp目錄下得文件隨時(shí)都回被刪除,因此需要移動(dòng)文件
NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
//6.2 剪切文件
[[NSFileManager defaultManager]moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
NSLog(@"%@",fullPath);
}];
//5.執(zhí)行Task
[downloadTask resume];
}