
一般通过以下两种方式使用磁盘缓存: ·文件缓存 ·数据库缓存(一般是指在SQLite数据库)
对于写入性能,SQLite数据库优于文件缓存;对于读取性能,情况稍微复杂一些。
我们都知道,iOS系统为了保证系统的安全性,采用了沙盒机制(即每个应用程序都会有自己的一个独立存储空间)。
其原理是通过重定向技术,把应用程序生成和修改的文件重定向到自身文件夹中。因此,在iOS应用程序里,磁盘缓存的数据一般都存储在沙盒中。
NSString *homeDir = NSHomeDirectory();
使用NSSearchPathForDirectoriesInDomains获取Document和Library文件夹的路径:,NSDocumentDirectory表示搜索Document,NSLibrary-Directory表示搜索Library
如果expandTilde参数为NO,即不展开路径,则返回路径如下: ~/Documents
获取tmp目录的路径需要使用NSTemporaryDirectory函数。
在Library文件夹下有两个常用的子文件夹: ·Caches ·Preferences
Caches文件夹主要用来保存应用程序运行时产生的需要持久化的数据,例如通过网络请求获取的数据。Caches文件夹下的数据,需要应用程序负责删除,并且`iTunes同步时不会保存该文件夹下的数据。
而Preferences文件夹保存的是应用程序的偏好设置,即iOS系统的设置应用会从该目录中读取偏好设置信息。因此,该目录一般不用于存储应用程序产生的数据。
tmp文件夹主要用于保存应用程序运行时产生的临时数据,使用后再将相应的文件从该目录中删除。
当应用程序不处于活跃状态时,系统也可能会清除该目录下的文件。
iTunes同步时,不会对tmp文件夹中的数据进行备份。
获取tmp文件夹路径的方法如下:
NSString *path = NSTemporaryDirectory();
在模拟器上,返回的路径示例:
/Users/wangzhuozhou/Library/Developer/CoreSimulator/Devices/9CDA0997-3FCD-433B-8FD0-DEEE9F9329ED/data/Containers/Data/Application/FB13FCEE-D25E-4183-BBF5-11DF3F371671/tmp/
通过以上综合对比发现,最适合缓存事件数据的地方,就是Library文件夹下的Caches子文件夹
+ (void)setObject:(id)value forKey:(NSString *)key{
[[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
+ (id)objectForKey:(NSString *)key{
return [[NSUserDefaults standardUserDefaults] objectForKey:key];
}
-(void)setBShowIntroduce:(BOOL)bShowIntroduce
{
// [SessionMgr Instance].strOrderAmount = bShowIntroduce;
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:bShowIntroduce] forKey:@"bShowIntroduce"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
/**
此版本是否提示过文案
*/
-(BOOL)bShowIntroduce
{
// return [SessionMgr Instance].strOrderAmount;
NSNumber *numShowIntroduce = [[NSUserDefaults standardUserDefaults] objectForKey: @"bShowIntroduce"];
return [numShowIntroduce boolValue];
}
使用文件缓存数据,实现起来相对比较简单,
可以使用NSKeyedArchiver类将字典对象进行归档并写入文件,也可以使用NSJSONSerialization类把字典对象转换成JSON格式字符串写入文件。
文件缓存是不够灵活的,我们很难使用更细的粒度去操作数据,比如,很难对其中的某一条数据进行读和写操。
把字典对象 持久化保存到文件中