iOS存储自定义类型到NSUserDefaults/数据库

2021-07-05 21:00:13 浏览数 (1)

  • 1.1 沙盒的根目录下有三个常用的文件夹:
  • 1.2 Library文件夹
  • 1.3 tmp文件夹
  • 1.4 standardUserDefaults 的使用
  • 2.1 把字典对象 持久化保存到文件中
  • 2.2 存储自定义类型对象到NSUserDefaults
  • 3.1 基本用法
  • 3.2 例子:创建一个处理数据库的工具类
  • 3.3 数据库缓存性能进行优化
  • 3.4 测试验证

前言

一般通过以下两种方式使用磁盘缓存: ·文件缓存 ·数据库缓存(一般是指在SQLite数据库)

对于写入性能,SQLite数据库优于文件缓存;对于读取性能,情况稍微复杂一些。

  • 当每页缓存容量在8192B到16384B之间时,数据库拥有最好的读写性能。
  • 如果单条数据小于100KB时,则从SQLite数据库中读取数据速度更快;单条数据大于100KB时,则从文件中读取速度更快。

I 沙盒

我们都知道,iOS系统为了保证系统的安全性,采用了沙盒机制(即每个应用程序都会有自己的一个独立存储空间)。

其原理是通过重定向技术,把应用程序生成和修改的文件重定向到自身文件夹中。因此,在iOS应用程序里,磁盘缓存的数据一般都存储在沙盒中。

  • 获取沙盒路径
代码语言:javascript复制
NSString *homeDir = NSHomeDirectory();

1.1 沙盒的根目录下有三个常用的文件夹:

  • Document: 保存的一般是应用程序本身产生的数据
  • Library
  • tmp

使用NSSearchPathForDirectoriesInDomains获取Document和Library文件夹的路径:,NSDocumentDirectory表示搜索Document,NSLibrary-Directory表示搜索Library

如果expandTilde参数为NO,即不展开路径,则返回路径如下: ~/Documents

获取tmp目录的路径需要使用NSTemporaryDirectory函数。

1.2 Library文件夹

在Library文件夹下有两个常用的子文件夹: ·Caches ·Preferences

Caches文件夹主要用来保存应用程序运行时产生的需要持久化的数据,例如通过网络请求获取的数据。Caches文件夹下的数据,需要应用程序负责删除,并且`iTunes同步时不会保存该文件夹下的数据。

而Preferences文件夹保存的是应用程序的偏好设置,即iOS系统的设置应用会从该目录中读取偏好设置信息。因此,该目录一般不用于存储应用程序产生的数据。

1.3 tmp文件夹

tmp文件夹主要用于保存应用程序运行时产生的临时数据,使用后再将相应的文件从该目录中删除。

当应用程序不处于活跃状态时,系统也可能会清除该目录下的文件。

iTunes同步时,不会对tmp文件夹中的数据进行备份。

获取tmp文件夹路径的方法如下:

代码语言:javascript复制
NSString *path = NSTemporaryDirectory();

在模拟器上,返回的路径示例:

代码语言:javascript复制
/Users/wangzhuozhou/Library/Developer/CoreSimulator/Devices/9CDA0997-3FCD-433B-8FD0-DEEE9F9329ED/data/Containers/Data/Application/FB13FCEE-D25E-4183-BBF5-11DF3F371671/tmp/

通过以上综合对比发现,最适合缓存事件数据的地方,就是Library文件夹下的Caches子文件夹

1.4 standardUserDefaults 的使用

  • 偏好设置的工具方法

代码语言:javascript复制
  (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];
}
  • 例子: 是否展示过版本新特性,也即是引导页

代码语言:javascript复制
-(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];
}

II、 文件缓存

使用文件缓存数据,实现起来相对比较简单,

可以使用NSKeyedArchiver类将字典对象进行归档并写入文件,也可以使用NSJSONSerialization类把字典对象转换成JSON格式字符串写入文件。

文件缓存是不够灵活的,我们很难使用更细的粒度去操作数据,比如,很难对其中的某一条数据进行读和写操。

2.1 把字典对象 持久化保存到文件中

把字典对象 持久化保存到文件中

0 人点赞