離線緩存

實(shí)現(xiàn)數(shù)據(jù)的離線緩存,當(dāng)在建立起數(shù)據(jù)請(qǐng)求的時(shí)候,根據(jù)url生成一個(gè)文件路徑,讓數(shù)據(jù)下載到一個(gè)臨時(shí)的文件路徑下。

  • 第一種情況:當(dāng)請(qǐng)求發(fā)起時(shí)一直下載到下載成功,這時(shí)候就將該文件移動(dòng)到緩存目錄下緩存起來(lái)。
  • 第二種情況:當(dāng)中斷下載數(shù)據(jù)時(shí),對(duì)該臨時(shí)文件不做任何處理,然后再次播放該視頻請(qǐng)求數(shù)據(jù)時(shí),根據(jù)url生成的路徑查找當(dāng)前的臨時(shí)路徑下有無(wú)該文件,如果有說(shuō)明該文件沒(méi)有下載完成,則需要讀到這個(gè)文件然后做斷點(diǎn)續(xù)傳操作,讓該文件繼續(xù)下載,而不是重頭開(kāi)始下載。
- (void)fileJudge{
    //判斷當(dāng)前目錄下有無(wú)已有下載的臨時(shí)文件
    if ([_fileManager fileExistsAtPath:self.videoTempPath]) {
        //存在已下載數(shù)據(jù)的文件
        _fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:self.videoTempPath];
        _curruentLength = [_fileHandle seekToEndOfFile];
        
    }else{
        //不存在文件
        _curruentLength = 0;
        //創(chuàng)建文件
        [_fileManager createFileAtPath:self.videoTempPath contents:nil attributes:nil];
        _fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:self.videoTempPath];
    }
    //發(fā)起請(qǐng)求
    [self sendHttpRequst];
}
//網(wǎng)路請(qǐng)求方法
- (void)sendHttpRequst
{
    [_fileHandle seekToEndOfFile];
    NSURL *url = [NSURL URLWithString:_videoUrl];
    NSMutableURLRequest *requeset = [NSMutableURLRequest requestWithURL:url];
    
    //指定頭信息  當(dāng)前已下載的進(jìn)度
    [requeset setValue:[NSString stringWithFormat:@"bytes=%ld-", _curruentLength] forHTTPHeaderField:@"Range"];
    
    //創(chuàng)建請(qǐng)求
    NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:requeset];
    self.dataTask = dataTask;
    
    //發(fā)起請(qǐng)求
    [self.dataTask resume];
}

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    
    if (error == nil) { //下載成功
        //當(dāng)前下載文件的臨時(shí)路徑
        NSURL *tempPathURL = [NSURL fileURLWithPath:self.videoTempPath];
        //緩存路徑
        NSURL *cachefileURL = [NSURL fileURLWithPath:self.videoCachePath];

        // 如果沒(méi)有該文件夾,創(chuàng)建文件夾
        if (![self.fileManager fileExistsAtPath:self.videoCachePath]) {
            [self.fileManager createDirectoryAtPath:self.videoCachePath withIntermediateDirectories:YES attributes:nil error:nil];
        }
        
        // 如果該路徑下文件已經(jīng)存在,就要先將其移除,在移動(dòng)文件
        if ([self.fileManager fileExistsAtPath:[cachefileURL path] isDirectory:NULL]) {
            [self.fileManager removeItemAtURL:cachefileURL error:NULL];
        }
        //移動(dòng)文件至緩存目錄
        [self.fileManager moveItemAtURL:tempPathURL toURL:cachefileURL error:NULL];
    }
}

參考文章
延伸擴(kuò)展

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容