離線快取
實現資料的離線快取,當在建立起資料請求的時候,根據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];
}
}
相關文章
- ServiceWorker 快取離線化快取
- 快取專題:HTML5離線快取與HTTP快取快取HTMLHTTP
- 實現AVPlayer離線快取快取
- HTML5 manifest離線快取HTML快取
- 借用workbox實現離線快取應用快取
- Service Worker學習與實踐(一)——離線快取快取
- PWA之前端專案,實現可安裝、離線快取、訊息推送前端快取
- 扣丁學堂HTML5開發manifest離線快取示例詳解HTML快取
- 快取穿透、快取擊穿、快取雪崩、快取預熱快取穿透
- 快取穿透、快取擊穿、快取雪崩快取穿透
- 快取穿透、快取雪崩、快取擊穿快取穿透
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- [Redis]快取穿透/快取擊穿/快取雪崩Redis快取穿透
- HTTP快取——協商快取(快取驗證)HTTP快取
- 快取穿透 快取雪崩快取穿透
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- 快取穿透、快取擊穿、快取雪崩區別快取穿透
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- ServiceWorker 快取與 HTTP 快取快取HTTP
- mybatis快取-二級快取MyBatis快取
- MyBatis快取機制(一級快取,二級快取)MyBatis快取
- 快取淘汰、快取穿透、快取擊穿、快取雪崩、資料庫快取雙寫一致性快取穿透資料庫
- eKuiper Newsletter 2022-06|離線快取重發機制升級,優化弱網場景使用UI快取優化
- Redis詳解(十二)------ 快取穿透、快取擊穿、快取雪崩Redis快取穿透
- 什麼是redis快取雪崩、快取穿透、快取擊穿Redis快取穿透
- 分散式快取 - 快取簡介,常用快取演算法分散式快取演算法
- 快取穿透,快取擊穿,快取雪崩解決方案分析快取穿透
- Redis——快取穿透、快取擊穿、快取雪崩、分散式鎖Redis快取穿透分散式
- 快取穿透、快取雪崩和快取擊穿是什麼?快取穿透
- Redis快取穿透、快取雪崩、快取擊穿好好說說Redis快取穿透
- 離線簡訊應用無法正常讀取
- 快取最佳化(快取穿透)快取穿透
- Web快取 – HTTP協議快取Web快取HTTP協議
- 清理 Conda 快取和 Pip 快取快取
- [效能優化] 為虛擬列表增加離屏渲染和快取優化快取
- 如何設計快取系統:快取穿透,快取擊穿,快取雪崩解決方案分析快取穿透
- flutter 獲取應用快取以及清除快取Flutter快取
- 快取穿透、快取擊穿、快取雪崩概念及解決方案快取穿透