離線快取

weixin_33749242發表於2018-10-23

實現資料的離線快取,當在建立起資料請求的時候,根據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];
    }
}

參考文章
延伸擴充套件

相關文章