使用NSURLSessionDataTask实现大文件离线断点下载(完整)
阅读原文时间:2023年07月10日阅读:2

6.1 涉及知识点

(1)关于NSOutputStream的使用

//1. 创建一个输入流,数据追加到文件的屁股上  
//把数据写入到指定的文件地址,如果当前文件不存在,则会自动创建  
NSOutputStream \*stream = \[\[NSOutputStream alloc\]initWithURL:\[NSURL fileURLWithPath:\[self fullPath\]\] append:YES\];

//2. 打开流  
\[stream open\];

//3. 写入流数据  
\[stream write:data.bytes maxLength:data.length\];

//4.当不需要的时候应该关闭流  
\[stream close\];

(2)关于网络请求请求头的设置(可以设置请求下载文件的某一部分)

//1. 设置请求对象  
//1.1 创建请求路径  
NSURL \*url = \[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion\_01.mp4"\];

//1.2 创建可变请求对象  
NSMutableURLRequest \*request = \[NSMutableURLRequest requestWithURL:url\];

//1.3 拿到当前文件的残留数据大小  
self.currentContentLength = \[self FileSize\];

//1.4 告诉服务器从哪个地方开始下载文件数据  
NSString \*range = \[NSString stringWithFormat:@"bytes=%zd-",self.currentContentLength\];  
NSLog(@"%@",range);

//1.5 设置请求头  
\[request setValue:range forHTTPHeaderField:@"Range"\];

(3)NSURLSession对象的释放

-(void)dealloc
{
//在最后的时候应该把session释放,以免造成内存泄露
// NSURLSession设置过代理后,需要在最后(比如控制器销毁的时候)调用session的invalidateAndCancel或者resetWithCompletionHandler,才不会有内存泄露
// [self.session invalidateAndCancel];
[self.session resetWithCompletionHandler:^{

    NSLog(@"释放---");  
}\];  

}

(4)优化部分

        01 关于文件下载进度的实时更新

        02 方法的独立与抽取