在上一篇中的关于REST说了一些缓存策略,这里再扩展一下。
既然缓存,一般情况下,我们都会给缓存设定一个版本号,因为随着用户体验或者客户需求的变化,模型类可能会发生变化,这就意味着之前归档的任何数据将不能回复到新的模型上。对于按需缓存,数据并没有那么重要,开发者可以删除数据并更新应用。
缓存失效
通常会把应用的当前版本号保存在某个地方,可以用NSUserDefaults。检测版本升级,每次应用启动都要检查之前保存的版本号是否为应用当前的版本。如果为旧版本,把缓存文件删除,把新的版本号保存在NSUserDefaults中。
我们的App处理缓存版本的初始化方法
+(void)initializa{
NSString *cacheDit = [xxx cacheDirectory];
if(![NSFileManager defaultManager] fileExitsAtPath:cacheDirectory){
[[NSFileManager defaultManager] createDirectoryAtPath:cacheDirectory
withIntermediateDirectories:YES
attributes:nil
error:nil];
}
double lastSavesCacheVersion = [[NSUerDefaults standardUserDefaults] doubleForKey:@"Cahe_Version"];
double currentVersion = [[xxx appVersion] doubleValue];
if(lastSavesCacheVersion == 0.0f || lastSavesCacheVersion < currentVersion){
[xxx clearCache];
[[NSUerDefaults standardUserDefaults] setDouble:currentAppVersion ForKey:@"Cahe_Version"];
[[NSUerDefaults standardUserDefaults] synchronize];
}
}
从info.plist获取应用版本号
+(NSString) appVersion{
CFStringRef vers = (CFStringRef)CFBundleGetValueForInfoDictionaryKey
(CFBundleGetMainBundle(), KCFBundleVersionKey);
NSString *version = [NSString stringWithUTF8String:CFStringGetCStringPtr(vers,KCFSTringEncodingMacRoman)];
return version;
}
从缓存目录清楚缓存文件
+(void) clearCache{
NSArray *cachedItems = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:
[AppCache cacheDirectory] error:nil];
for(NSString *path in cachedItems)
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}
URL缓存
上篇博客已经举过类似数据模型缓存的简单Demo,这里就说一下URL缓存吧
我们可以通过为应用所做的每次URL请求缓存应答来实现URL缓存。这种缓存跟上面的例子有点类似。不同的地方就是缓存中保存的键值。数据模型采用文件名作为键,归档后做为值。但是URL缓存用URL作为键,应答的数据作为值。但是要注意的是,URL失效的管理。一般情况是交付给服务器管理。这里简单说一下吧。
过期认证
服务器一般会设置一个日期,超过这个日期后就认为资源过期。中间代理服务器或者浏览器应该在这个时间之后将资源设置为无效或者过期。
验证模型
服务器一般都会发送一个校验和。所有从缓存获得资源的请求都应该用这个校验和向服务器重新验证资源是否变化。如果匹配则返回304状态码。
Demo
过期缓存头的nginx设置
location ~ \ .(jpg|png)${
expires 8d;
}
告诉中间代理服务器吧jpg结尾的文件缓存8天。我们作为客户端开发人员,则需要在设备上缓存图片并遵守这些头的指令,而不是每隔几天就把本地缓存中所有的图片设置失效。
一般静态应答,图片和缩略图用过期模型,但是大部分动态应答用验证模型。客户端在每个后续请求的IF-NONE-MATCH中发送验证缓存,服务器计算校验和之后,检查校验和是否与IF-NONE-MATCH头匹配。
用URL缓存图片相信作为开发人员一定是最最常用的方法,我做的几个项目也都是采用这种方式来缓存图片的。还有文件啊,音乐,视频等,不管是哪种类型,我们都是通过URL作为键,图片数据就是缓存对象。为什么URL缓存能优化性能呢?因为URL缓存不需要后期处理应答。存储的值就是(JPEG,PNG)而不需要再次转换成目标格式。