0.遵守协议
<NSURLSessionDataDelegate>
属性
/** 沙盒地址 */
@property(nonatomic,strong) NSString fullPath;
/ 数据总大小 /
@property(nonatomic,assign) NSInteger totalSize;
/ 当前数据大小 /
@property(nonatomic,assign) NSInteger currentSize;
/ 文件句柄 */
@property(nonatomic,strong) NSFileHandle handle;
/ dataTask */
@property(nonatomic,strong) NSURLSessionDataTask dataTask;
/ 会话对象 **/
@property(nonatomic,strong) NSURLSession *session;
实现按钮方法
再懒加载中实现(dataTask属性)
1.确定URL
NSURL *url = [NSURL URLWithString:@""];
2.创建请求对象
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
//获取指定文件路径对应文件的数据大小(获得沙盒中数据的大小)
NSDictionary *fileInfoDict = [[NSFileManager defaultManager] attributesOfItemAtPath:self.fullPath error:nil];
self.currentSize = [fileInfoDict[@"NSFileSize"] integerValue];
2.1 设置请求头信息,告诉服务器请求哪一部分数据
NSString *range = [NSString stringWithFormat:@"bytes=%zd-" , self.currentSize];
[request setValue:range forHTTPHeaderField:@"Range"];
3.创建会话对象(自定义),设置代理
self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
4.利用会话对象创建Task发送请求
self.dataTask = [session dataTaskWithRequest:request];
开始按钮中实现
5.执行Task
[self.dataTask resume];
暂停按钮中实现
[self.dataTask suspend];
取消按钮中实现
//取消是不可以恢复的
[self.dataTask cancel];
self.dataTask = nil;
继续下载按钮中实现
[self.dataTask resum];
实现代理方法
//接收到服务器的响应 他会默认取消该请求(在回调中告诉系统,不要取消)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
completionHandler(NSURLSessionResponseAllow);
//1.获得文件总大小(本次请求的文件数据的总大小)
self.totalSize = response.expectedContentLength + self.currentSize;
//2.写数据到沙盒(拼接文件全路径)
self.fullPath = [[NSSearchPathForDirectoriesInDomains(NSCacheDirector , NSUserDomainMask , YES) lastObject] stringByAppendingPathComponent:@"123.mp4"];
if(self.currentSize == 0){
//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;
}
释放会话对象(不释放内存会有问题)
-(void)delloc{
//finishTasksAndInvalidate(这两个方法是一样的)
[self.session incalidateAndCancel];
}
- 只要是用到session(会话对象),设置了代理,就需要释放会话对象