NSURLSession使文件下載變得非常方便,只需要提供簡單的配置红淡,下面講述使用NSURLSession實現(xiàn)文件下載的使用方法,這里只是實現(xiàn)前臺下載(應(yīng)用在沒有退出的時候的下載)
配置NSURLSession
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
self.sessionConfiguration = sessionConfiguration;
NSURLSession *downloadSession = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
self.session = downloadSession;
NSURL *url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/797b4439e2551/QQ_mac_5.0.2.dmg"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionDownloadTask *downloadTask = [downloadSession downloadTaskWithRequest:request];
self.downloadTask = downloadTask;
上述代碼將NSURLSession配置為默認(rèn)配置不狮,設(shè)置下載的URL地址,最后通過URL生成的request生成一個下載任務(wù)在旱,生成任務(wù)之后可以調(diào)用 [downloadTask resume]也可以后面出發(fā)再調(diào)用摇零,比如點(diǎn)擊了下載按鈕之后再調(diào)用。
處理下載委托
進(jìn)度回調(diào)
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
NSLog(@"bytesWritten=%@,totalBytesWritten=%@,totalBytesExpectedToWrite=%@",@(bytesWritten),@(totalBytesWritten),@(totalBytesExpectedToWrite));
float progress = (float)totalBytesWritten/totalBytesExpectedToWrite;
self.downloadView.progress = progress;
}
當(dāng)任務(wù)開始下載桶蝎,系統(tǒng)會將文件先下載到臨時文件中遂黍,上述回調(diào)终佛,表示下載到臨時文件中的字節(jié)數(shù)、文件的總字節(jié)數(shù)雾家。這個比較簡單铃彰,進(jìn)度顯示一一般放在這里.
下載完成回調(diào)
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
NSLog(@"任務(wù)下載完成");
self.downloadView.progress = 1.0;
//將臨時文件拷貝到永久文件中
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:@"1.dmg"];
NSError *error = nil;
if ( [[NSFileManager defaultManager] fileExistsAtPath:filePath] ) {
[[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
}
[[NSFileManager defaultManager] copyItemAtURL:location toURL:[NSURL fileURLWithPath:filePath] error:&error];
if ( error ) {
NSLog(@"錯誤信息為:%@",[error localizedDescription]);
}else{
NSLog(@"拷貝文件成功,文件的路徑為:%@",filePath);
}
}
當(dāng)任務(wù)下載完成之后芯咧,系統(tǒng)會將文件儲存的臨時文件的路徑給出來牙捉,讓我們自己處理,需要將臨時文件拷貝到永久文件中敬飒。
整個任務(wù)完成處理
//無論是數(shù)據(jù)任務(wù)還是上傳任務(wù)執(zhí)行完之后都會執(zhí)行該回調(diào)
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"整個任務(wù)完成");
if (error) {
// check if resume data are available
if ([error.userInfo objectForKey:NSURLSessionDownloadTaskResumeData]) {
NSData *resumeData = [error.userInfo objectForKey:NSURLSessionDownloadTaskResumeData];
//通過之前保存的resumeData邪铲,獲取斷點(diǎn)的NSURLSessionTask,調(diào)用resume恢復(fù)下載
self.resumeData = resumeData;
//彈出提示框无拗,如果需要重新下載带到,則調(diào)用[download taskwithResumeData]
}
} else {
//下載完成處理
}
}
無論是數(shù)據(jù)任務(wù)還是上傳任務(wù),還是下載任務(wù)英染,任務(wù)完成了揽惹,都會執(zhí)行該回調(diào),error為空四康,表示沒有錯誤搪搏,正常完成,error表示在下載過程中出現(xiàn)了錯誤闪金,我們可以從error中取出,resumeData,如果需要繼續(xù)下載疯溺,只要調(diào)用downloadTask中的downloadTaskWithResumeData方法即可實現(xiàn)斷點(diǎn)下載,非常方便哎垦。
如果需要手動暫停囱嫩,可以調(diào)用taskDownload中的suspend方法(也可以調(diào)用cancelByProducingResumeData),如果需要繼續(xù)下載則調(diào)用taskDownload中的resume即可.
總結(jié)
NSURLSession為下載文件提供提供了便利的接口漏设,只需要簡單的配置和實現(xiàn)幾個簡單的協(xié)議即可挠说,文件的數(shù)據(jù)處理也不需要我們關(guān)心,下載完成之需要將臨時文件拷貝到永久文件中即可.NSURLSession實現(xiàn)斷點(diǎn)續(xù)傳也非常方便愿题,下載出現(xiàn)了錯誤或者是用戶手動暫停了损俭,也不需要重新下載,只要將error中的resumeData取出來潘酗,然后調(diào)用taskDownload中的downloadTaskWithResumeData即可杆兵。比NSURLConnection實在是方便太多.