0.遵守协议
<NSURLSessionDataDelegate>
1.确定URL
NSURL *url = [NSURL URLWithString:@""];
2.创建请求对象
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
3.创建会话对象(自定义),设置代理
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
4.利用会话对象创建Task发送请求
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
5.执行Task
[dataTask resume];
实现代理方法
/** 沙盒地址 */
@property(nonatomic,strong) NSString fullPath;
/ 数据总大小 /
@property(nonatomic,assign) NSInteger totalSize;
/ 当前数据大小 /
@property(nonatomic,assign) NSInteger currentSize;
/ 文件句柄 **/
@property(nonatomic,strong) NSFileHandle *handle;
//接收到服务器的响应 他会默认取消该请求(在回调中告诉系统,不要取消)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
completionHandler(NSURLSessionResponseAllow);
//1.获得文件总大小(本次请求的文件数据的总大小)
self.totalSize = response.expectedContentLength;
//2.写数据到沙盒(拼接文件全路径)
self.fullPath = [[NSSearchPathForDirectoriesInDomains(NSCacheDirector , NSUserDomainMask , YES) lastObject] stringByAppendingPathComponent:@"123.mp4"];
//3.创建一个空的文件
[[NSFileManager defaultManager] createFileAtPath:self.fulPath contents:nil attributes:nil];
//4.创建文件句柄(指针)
self.handle = [NSFileHandle fileHandleForWritingAtPath:self.fullPath];
}
//接收到服务器返回的数据 (调用多次)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
//1.移动文件句柄到数据的结尾
[self.handle seekToEndOfFile];
//2.写数据
[self.handle writeData:data];
//3.获得进度
self.currentSize += data.length;
//进度
NSLog(@"%f" , 1.0 * self.currentSize / self.totalSize);
}
//请求结束或者是失败的时候调用
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
//1.关闭文件句柄
[self.handle closeFile];
self.handle = nil;
}