离线缓存

实现数据的离线缓存,当在建立起数据请求的时候,根据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];
    }
}

参考文章
延伸扩展

你可能感兴趣的:(离线缓存)