iOS持久化
https://blog.csdn.net/m0_55124878/article/details/126043947?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172258420116800186597839%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=172258420116800186597839&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-126043947-null-null.142v100control&utm_term=iOS持久化&spm=1018.2226.3001.4187
一、数据持久化的目的
1.快速展示,提升体验
- 已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户
2.节省用户流量(节省服务器资源)
- 对于较大的资源数据进行缓存,下次展示无需下载消耗流量
- 同时降低了服务器的访问次数,节约服务器资源。(图片)
3.离线使用。
- 用户浏览过的数据无需联网,可以再次查看。
- 部分功能使用解除对网络的依赖。(百度离线地图、图书阅读器)
- 无网络时,允许用户进行操作,等到下次联网时同步到服务端。
4.记录用户操作
- 草稿:对于用户需要花费较大成本进行的操作,对用户的每个步骤进行缓存,用户中断操作后,下次用户操作时直接继续上次的操作。
- 已读内容标记缓存,帮助用户识别哪些已读。
- 搜索记录缓存
二、iOS中数据持久化方案
NSUserDefault
简单数据快速读写Property list
(属性列表)文件存储Archiver
(归档)SQLite
本地数据库CoreData
三、移动端的数据持有方式
内存指当前程序的运行空间,缓存速度快容量小,是临时存储文件用的,供CPU直接读写。打开一个程序,他是在内存中存储,关闭程序后内存就又回到原来的空间空间。
磁盘是程序的存储空间,缓存容量大、速度慢、可持有化。与内存不同的是磁盘是永久存储东西的。
内存缓存
-
定义: 对于使用频率比较高的数据,从网络或磁盘加载数据到内存以后,使用后并不马上销毁,下次使用直接从内存加载。
-
案例:
- iOS系统图片加载 —— [UIImage imageNamed:@“imageName”]
- 网络图片加载三方库 SDWebImage
磁盘缓存
-
定义:将从网络加载的,用户操作产生的数据写入到磁盘,用户下次查看、继续操作时,直接从磁盘加载使用
-
案例:
- 用户输入内容草稿缓存
- 搜索历史缓存
- 网络图片加载三方库 SDWebImage
沙盒机制
iOS中的沙盒机制是一种安全体系。为了保证系统安全,iOS每个应用程序在安装时,会创建属于自己的沙盒文件(存储空间)。应用程序只能访问自身的沙盒文件,不能访问其他应用程序的沙盒文件,当应用程序需要向外部请求或接收数据时,都需要经过权限认证,否则,无法获取到数据。所有的非代码文件都要保存在此,例如属性文件plist、文本文件、图像、图标、媒体资源等,其原理是通过重定向技术,把程序生成和修改的文件定向到自身文件夹中。
获取沙盒路径
// 获取沙盒根目录路径
NSString *path = NSHomeDirectory();
注意: 每次编译代码会生成新的沙盒路径,注意是编译不是启动,所以模拟机或者真机运行,每次运行所得到的沙盒路径都是不一样的,线上版本app真机不会生成新的沙盒路径。
访问沙盒目录常用C函数介绍
//文件路径搜索
FOUNDATION_EXPORT NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);
- 参数一
NSSearchPathDirectory directory
:指定搜索的目录名称,比如这里用NSDocumentDirectory表明我们要搜索的是Documents目录。如果我们将其换成NSCachesDirectory就表示我们搜索的是Library/Caches目录。 - 参数二 NSSearchPathDomainMask domainMask:搜索主目录的位置,NSUserDomainMask表示搜索的范围限制于当前应用的沙盒目录。还可以写成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。
- 参数三
BOOL expandTilde
:是否获取完整的路径,我们知道在iOS中的全写形式是/User/userName,该值为YES即表示写成全写形式,为NO就表示直接写成“~”。- 该值为NO:Caches目录路径为~/Library/Caches
- 该值为YES:Caches目录路径为/var/mobile/Containers/Data/Application/E7B438D4-0AB3-49D0-9C2C-B84AF67C752B/Library/Caches
- (void)searchpath {
NSString* path = NSHomeDirectory() ;
NSLog(@"%@",path) ;
NSString* docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask , YES) firstObject];
//参数1:查找的目标的路径
//参数2:在哪里查找,查找的范围;
//参数3:是否给出完整路径
NSLog(@"%@",docDir) ;
NSString* libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask , YES) firstObject];
NSLog(@"%@",libDir) ;
NSString* CacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask , YES) firstObject];
NSLog(@"%@",CacheDir);
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults] ;
NSLog(@"%@",defaults) ;
}
沙盒目录
Documents
:保存持久化数据,会备份。一般用来存储需要持久化的数据。
一般我们在项目中,我们会把一些用户的登录信息以及搜索历史记录等一些关键数据存储到这里。
此文件夹是默认备份的,备份到iCloud。
注:iCloud的备份,会通过Wi-Fi每天自动备份用户iOS设备。
Library
:默认存放设置和其他状态信息,除了caches子目录之外其他目录都会被iclude同步。Application Support
:此目录包含应用程序用来运行但应对用户隐藏的文件,如游戏的新关卡等文件。- Caches:保存应用运行时生成的需要持久化的数据,一般存储体积大、不需要备份的非重要数据,如网络请求的音视频与图片等的缓存。在 iOS 5.0 及以后版本中,Caches 当系统磁盘空间非常低时,系统可能会在极少数情况下该删除目录(APP 正在运行时不会发生),所以尽量保证该路径的文件在 APP 在重新运行时可以得到重新创建。
Cooikes
:系统会自动将App中网络请求的cookie保存为文件。Preferences
:保存应用的所有偏好设置。UserDefaults 生成的 plist 文件就会保存该目录下。-
SplashBoard
:存储启动屏缓存,缓存文件格式为 ktx,本质上就是图片,如果启动屏不生效的问题可以考虑从删除该路径下相关缓存文件这个角度解决。
SystemData
:存放系统数据,无对外暴露的接口。tmp
:临时文件夹(系统会不定期删除里面的文件)。