方式一
/缺点:无法监听文件的进度
-(void)downloadTaskDownLoadFile{
//01 确定资源路径
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/abc.jpeg"];
//02 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//03 创建会话对象
NSURLSession *session = [NSURLSession sharedSession];
//04 创建downloadTask
/* 参数说明
* location:位置 文件的位置 ,默认已经把数据写到磁盘中:tmp/...随时可能被删除
* response:响应头信息
*/
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request
completionHandler:^(NSURL * location, NSURLResponse * response,
NSError * error) {
NSLog(@"%@",location);
//转移文件(转移到安全的地方去)
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *fullPath = [cachePath stringByAppendingPathComponent:response.suggestedFilename];
// 文件下载完成后将文件移动到需要保存的地方
[[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
}];
//05 发送请求
[downloadTask resume];
}
方式二 代理方式下载文件
发送数据请求
-(void)downloadTaskDownLoadFile
{
//01 确定资源路径
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/abc.jpeg"];
//02 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//03 创建会话对象 设置代理
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//04 创建downloadTask
NSURLSessionDownloadTask *downloadTask =[session downloadTaskWithRequest:request];
//05 发送请求
[downloadTask resume];
}
处理代理 NSURLSessionDownloadDelegate
- 01 写数据的时候调用
-(void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten //本次写入的数据大小
totalBytesWritten:(int64_t)totalBytesWritten //写入数据的总大小
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite //文件的总大小
{
NSLog(@"%f",1.0 * totalBytesWritten / totalBytesExpectedToWrite);
}
- 02 下载完成的时候调用
-(void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
//转移文件(转移到安全的地方去)
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *fullPath = [cachePath stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
//剪切文件
[[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
NSLog(@"%@",fullPath);
}
- 03 整个请求结束或者是失败的时候调用
-(void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error
{
NSLog(@"didCompleteWithError");
}
三 总结
- 介绍下NSURLSessionTask的几个子类
1> NSURLSessionTask 是个抽象类,如果要使用只能使用它的子类
2> NSURLSessionTask 有两个子类:
>一个是NSURLSessionDataTask,该task 可以用来处理一般的网络请求,如GET和PSOT请求.
>一个是NSURLSessionDownloadTask ,该task在处理文件下载时有很大的优势,不需要做文件的拼接写入功能.确定不能实现离线断点下载
3> NSURLSessionDataTask 有一个子类,为NSURLSessionUploadTask,该请求在处理文件上传是很有优势.
- 如和处理Session对代理的强引用的
调用session 的2个方法 (一般是在将要消失控制器时调用)
1> 1个是终止请求
2> 2个是请求完成后自动结束
- 在使用NSURLSessionDataTask断点下载文件的要点是什么?
1> 在请求文件时确保设置请求头信息 Range 范围. @"bytes=起始位置-长度" //起始位置和长度其中有一个可以不要,中间不能有空格
2> 从响应头中获取 正确的文件下载总长度.
3> 文件句柄在最开始写入文件时要保证移动到了文件的末尾
4> 文件写完后,需要关闭文件句柄
网友评论