Last-Modified
是資源最後修改的時間戳,每每與緩存時間進行對比來判斷緩存是否過時。json
ETag
是的功能與
Last-Modified
相似:服務端不會每次都會返回文件資源。客戶端每次向服務端發送上次服務器返回的
ETag
值,服務器會根據客戶端與服務端的
ETag
值是否相等,來決定是否返回 data,同時老是返回對應的
HTTP
狀態碼。客戶端經過
HTTP
狀態碼來決定是否使用緩存。好比:服務端與客戶端的
ETag
值相等,則
HTTP
狀態碼爲 304,不返回 data。服務端文件一旦修改,服務端與客戶端的
ETag
值不等,而且狀態值會變爲200,同時返回 data。
- (void)downloadFile緩存
{服務器
/*網絡
1.NSURLRequestUseProtocolCachePolicy NSURLRequest 默認的cache policy,使用Protocol協議定義。ide
2.NSURLRequestReloadIgnoringCacheData 忽略緩存直接從原始地址下載。code
3.NSURLRequestReturnCacheDataDontLoad 只使用cache數據,若是不存在cache,請求失敗;用於沒有創建網絡鏈接離線模式orm
4.NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data時才從原始地址下載。資源
5.NSURLRequestReloadIgnoringLocalAndRemoteCacheData 忽略本地和遠程的緩存數據,直接從原始地址下載,與NSURLRequestReloadIgnoringCacheData相似。get
6.NSURLRequestReloadRevalidatingCacheData :驗證本地數據與遠程數據是否相同,若是不一樣則下載遠程數據,不然使用本地數據string
*/
NSString *fileDownLoadPath = @"https://s3.cn-north-1.amazonaws.com.cn/zplantest.s3.seed.meme2c.com/area/area.json";
NSString *lastModified = [NSUserDefaults.standardUserDefaults stringForKey:@"Last-Modified"] ?: @"";
NSString *lastModifiedeTag = [NSUserDefaults.standardUserDefaults stringForKey:@"Etag"] ?: @"";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:fileDownLoadPath]];
// request.cachePolicy = NSURLRequestUseProtocolCachePolicy;
// 服務器作對比, 不用重複下載
// [request setValue:lastModified forHTTPHeaderField:@"If-Modified-Since"]; // Last-Modified
[request setValue:lastModifiedeTag forHTTPHeaderField:@"If-None-Match"]; // ETag
[request setValue:@"no-cache" forHTTPHeaderField:@"Cache-Control"];
LMJWeakSelf(self);
NSLog(@"%@", request);
MBProgressHUD *hud = [MBProgressHUD showProgressToView:weakself.view Text:@"下載中"];
[[[LMJRequestManager sharedManager] downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
hud.progress = (downloadProgress.completedUnitCount) / (CGFloat)(downloadProgress.totalUnitCount);
NSLog(@"%lf", ((float)downloadProgress.completedUnitCount) / (downloadProgress.totalUnitCount));
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
return [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:[fileDownLoadPath lastPathComponent]]];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
[MBProgressHUD hideHUDForView:weakself.view animated:YES];
NSLog(@"%@", filePath);
NSLog(@"%@", response);
NSLog(@"%@", error);
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
[self.view makeToast:[NSString stringWithFormat:@"statuscode: %zd, \n200是下載成功, 304是不用下載", httpResponse.statusCode]];
NSString *lastModified = [httpResponse allHeaderFields][@"Last-Modified"];
NSString *lastModifiedeTag = [httpResponse allHeaderFields][@"Etag"];
if (lastModified && !error) {
[NSUserDefaults.standardUserDefaults setObject:lastModified forKey:@"Last-Modified"];
[NSUserDefaults.standardUserDefaults setObject:lastModifiedeTag forKey:@"Etag"];
}
NSLog(@"%@", lastModified);
}] resume];
}