離線快取
實現資料的離線快取,當在建立起資料請求的時候,根據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 快取離線化快取
- 實現AVPlayer離線快取快取
- 快取專題:HTML5離線快取與HTTP快取快取HTMLHTTP
- HTML5 manifest離線快取HTML快取
- 借用workbox實現離線快取應用快取
- 給Retrofit新增離線快取,支援Post請求快取
- Android WebView 實現離線快取閱讀AndroidWebView快取
- Service Worker學習與實踐(一)——離線快取快取
- 深入理解HTML5離線快取機制HTML快取
- iOS資料庫離線快取思路和網路層封裝iOS資料庫快取封裝
- PWA之前端專案,實現可安裝、離線快取、訊息推送前端快取
- 扣丁學堂HTML5開發manifest離線快取示例詳解HTML快取
- 快取穿透、快取擊穿、快取雪崩快取穿透
- 快取穿透、快取雪崩、快取擊穿快取穿透
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- HTTP快取——協商快取(快取驗證)HTTP快取
- 【高併發簡單解決方案】redis快取佇列+mysql 批量入庫+php離線整合Redis快取佇列MySqlPHP
- 快取穿透 快取雪崩快取穿透
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- 快取穿透、快取擊穿、快取雪崩區別快取穿透
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- oracle 11g 快取和連線池Oracle快取
- ServiceWorker 快取與 HTTP 快取快取HTTP
- mybatis快取-二級快取MyBatis快取
- 離線簡訊應用無法正常讀取
- MyBatis快取機制(一級快取,二級快取)MyBatis快取
- 快取、快取演算法和快取框架簡介快取演算法框架
- 快取淘汰、快取穿透、快取擊穿、快取雪崩、資料庫快取雙寫一致性快取穿透資料庫
- [效能優化] 為虛擬列表增加離屏渲染和快取優化快取
- redis作為mysql的快取伺服器(讀寫分離)RedisMySql快取伺服器
- Nginx作為動靜分離、快取與負載均衡初探Nginx快取負載
- Redis詳解(十二)------ 快取穿透、快取擊穿、快取雪崩Redis快取穿透
- 面試總結 —— Redis “快取穿透”、“快取擊穿”、“快取雪崩”面試Redis快取穿透
- 快取穿透,快取擊穿,快取雪崩解決方案分析快取穿透
- 快取穿透、快取雪崩和快取擊穿是什麼?快取穿透
- Redis——快取穿透、快取擊穿、快取雪崩、分散式鎖Redis快取穿透分散式
- Redis快取穿透、快取雪崩、快取擊穿好好說說Redis快取穿透
- 分散式快取 - 快取簡介,常用快取演算法分散式快取演算法