实现数据的离线缓存,当在建立起数据请求的时候,根据url生成一个文件路径,让数据下载到一个临时的文件路径下。
- 第一种情况:当请求发起时一直下载到下载成功,这时候就将该文件移动到缓存目录下缓存起来。
- 第二种情况:当中断下载数据时,对该临时文件不做任何处理,然后再次播放该视频请求数据时,根据url生成的路径查找当前的临时路径下有无该文件,如果有说明该文件没有下载完成,则需要读到这个文件然后做断点续传操作,让该文件继续下载,而不是重头开始下载。
- (void)fileJudge{
//判断当前目录下有无已有下载的临时文件
if ([_fileManager fileExistsAtPath:self.videoTempPath]) {
//存在已下载数据的文件
_fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:self.videoTempPath];
_curruentLength = [_fileHandle seekToEndOfFile];
}else{
//不存在文件
_curruentLength = 0;
//创建文件
[_fileManager createFileAtPath:self.videoTempPath contents:nil attributes:nil];
_fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:self.videoTempPath];
}
//发起请求
[self sendHttpRequst];
}
//网路请求方法
- (void)sendHttpRequst
{
[_fileHandle seekToEndOfFile];
NSURL *url = [NSURL URLWithString:_videoUrl];
NSMutableURLRequest *requeset = [NSMutableURLRequest requestWithURL:url];
//指定头信息 当前已下载的进度
[requeset setValue:[NSString stringWithFormat:@"bytes=%ld-", _curruentLength] forHTTPHeaderField:@"Range"];
//创建请求
NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:requeset];
self.dataTask = dataTask;
//发起请求
[self.dataTask resume];
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
if (error == nil) { //下载成功
//当前下载文件的临时路径
NSURL *tempPathURL = [NSURL fileURLWithPath:self.videoTempPath];
//缓存路径
NSURL *cachefileURL = [NSURL fileURLWithPath:self.videoCachePath];
// 如果没有该文件夹,创建文件夹
if (![self.fileManager fileExistsAtPath:self.videoCachePath]) {
[self.fileManager createDirectoryAtPath:self.videoCachePath withIntermediateDirectories:YES attributes:nil error:nil];
}
// 如果该路径下文件已经存在,就要先将其移除,在移动文件
if ([self.fileManager fileExistsAtPath:[cachefileURL path] isDirectory:NULL]) {
[self.fileManager removeItemAtURL:cachefileURL error:NULL];
}
//移动文件至缓存目录
[self.fileManager moveItemAtURL:tempPathURL toURL:cachefileURL error:NULL];
}
}