博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 再说缓存
阅读量:4108 次
发布时间:2019-05-25

本文共 2442 字,大约阅读时间需要 8 分钟。

在上一篇中的关于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)而不需要再次转换成目标格式。

转载地址:http://ejtsi.baihongyu.com/

你可能感兴趣的文章
configure: error: Please reinstall the BZip2 distribution
查看>>
OpenCV gpu模块样例注释:video_reader.cpp
查看>>
【增强学习在无人驾驶中的应用】
查看>>
OpenCV meanshift目标跟踪总结
查看>>
那些人生“开挂”的程序员,都在干什么?
查看>>
影响科学圈的那些计算机代码
查看>>
如何判断一家互联网公司要倒闭了?
查看>>
想快速上手机器学习?来看下这个 GitHub 项目!
查看>>
GitHub 标星 3.6k,一本开源的深度学习中文教程!
查看>>
9 款你不能错过的 JSON 工具
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
卧槽!小姐姐用动画图解 Git 命令,这也太秀了吧?!
查看>>
厉害了!Python 编辑器界的神器 Jupyter ,推出官方可视化 Debug 工具!
查看>>
卧槽!Java 虚拟机竟然还有这些性能调优技巧...
查看>>
听说玩这些游戏能提升编程能力?
查看>>
再见,Eclipse...
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
当你无聊时,可以玩玩 GitHub 上这个开源项目...
查看>>
B 站爆红的数学视频,竟是用这个 Python 开源项目做的!
查看>>