前言
持久化是将程序数据的持久状态和瞬时状态转化的机制,通俗的讲,就是瞬时数据持久化为持久数据。持久化(Persistence),即把数据(如内存中的对象)保存到永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
一、沙盒简介
沙盒(standbox),其原理是通过重定向技术(类似:Linux系统中重定向:系统把输出的数据写入到一个文件中的过程),把程序生成和修改的文件定向到自身文件夹中。在沙盒机制下,每个程序之间的文件夹不能相互访问。iOS系统为了保证系统安全采用的一种保护机制。(Android系统下,App之间可以相互共享数据)
iOS应用程序在安装时,会通过重定向的方式创建属于应用的沙盒文件。应用程序不能直接访问其他应用程序的沙盒文件,当应用程序需要向外部请求或者接收数据时,都需要经过权限认证,否则,无法获取数据。 此规则的一个例外是当应用程序使用公共系统接口访问用户的联系人或音乐等内容时。 在这些情况下,系统框架使用帮助应用程序来处理读取或修改适当数据存储所需的任何与文件相关的操作。
二、沙盒的使用详解
列出了sandbox目录中一些更重要的子目录,并描述了它们的预期用法。 此表还描述了每个子目录的任何其他访问限制,并指出目录的内容是否由iTunes和iCloud备份
directory | Descript |
---|---|
AppName.app | 这是应用程序的捆绑包。 该目录包含应用程序及其所有资源。 您无法写入此目录。 为防止篡改,bundle目录在安装时签名。 写入此目录会更改签名并阻止您的应用启动。 但是,您可以获得对应用程序包中存储的任何资源的只读访问权限。 iTunes或iCloud不会备份此目录的内容。 但是,iTunes确实执行从App Store购买的任何应用程序的初始同步。 |
Documents/ | 使用此目录存储用户生成的内容。 该目录的内容可以通过文件共享提供给用户; 因此,他的目录应该只包含您可能希望向用户公开的文件。 该目录的内容由iTunes和iCloud备份。 |
Library/ | 这是非用户数据文件的任何文件的顶级目录。 您通常将文件放在几个标准子目录之一中。 iOS应用程序通常使用Application Support和Caches子目录; 但是,您可以创建自定义子目录。 对于您不希望向用户公开的任何文件,请使用Library子目录。 您的应用不应将这些目录用于用户数据文件. Library目录的内容(Caches子目录除外)由iTunes和iCloud备份。 |
tmp/ | 使用此目录可以编写在应用程序启动之间不需要保留的临时文件。 您的应用程序应在不再需要时删除此目录中的文件; 但是,当您的应用未运行时,系统可能会清除此目录。 iTunes或iCloud不会备份此目录的内容。 |
在项目中最常用的沙盒目录是Libray,接下来详细介绍一下Library目录下的文件
Directory(目录) | Usage(用法) |
---|---|
Application Support | 使用此目录存储除与用户文档关联的所有应用程序数据文件。 例如,您可以使用此目录存储应用程序创建的数据文件,配置文件,模板或应用程序管理的其他固定或可修改资源。 应用程序可能会使用此目录来存储最初包含在应用程序包中的可修改资源副本。 游戏可以使用该目录来存储用户购买并从服务器下载的新级别。 此目录中的所有内容都应放在自定义子目录中,该子目录的名称是应用程序包标识符或公司的名称。 在iOS中,此目录的内容由iTunes和iCloud备份。 |
Caches | 使用此目录可以编写应用程序可以轻松重新创建的任何特定于应用程序的支持文件。 您的应用程序通常负责管理此目录的内容以及根据需要添加和删除文件。 在iOS 2.2及更高版本中,iTunes或iCloud不会备份此目录的内容。 此外,系统会在完全恢复设备期间删除此目录中的文件。 在iOS 5.0及更高版本中,系统可能会在系统磁盘空间非常少的情况下删除Caches目录。 这在应用程序运行时永远不会发生。 但是,请注意从备份还原不一定是可以擦除Caches目录的唯一条件。 该目录一般用于网络请求下来的数据的存储 |
Preferences | 此目录包含特定于应用程序的首选项文件 您不应自己在此目录中创建文件。 而是使用NSUserDefaults类或CFPreferences API来获取和设置应用程序的首选项值。 在iOS中,此目录的内容由iTunes和iCloud备份。 |
三、文件,并发和线程安全
由于与文件相关的操作涉及与硬盘交互,因此与大多数其他操作相比较慢,因此iOS和macOS中的大多数与文件相关的接口都考虑了并发性。 有几种技术将异步操作合并到其设计中,而大多数其他技术可以从调度队列或辅助线程安全地执行。 下表出了本文档中讨论的一些关键技术,以及它们是否可以安全地从特定线程或任何线程使用。 有关任何接口功能的特定信息,请参阅该接口的参考文档。
Class/Technology | notes |
---|---|
NSFileManager | 对于大多数任务,可以安全地从多个后台线程同时使用默认的NSFileManager对象。 此规则的唯一例外是与文件管理器委托交互的任务。 将文件管理器对象与委托一起使用时,建议创建NSFileManager类的唯一实例,并将该委托与该实例一起使用。 然后,应该一次使用一个线程中的唯一实例。 |
Grand Central Dispatch | GCD本身可以安全地从任何线程使用。 但是,仍然负责以线程安全的方式编写块。 |
NSFileHandle, NSData, Cocoa streams | 用于读取和写入文件数据的大多数Foundation对象都可以在任何单个线程中使用,但不应同时从多个线程使用。 |
NSURL and NSString | 用于指定路径的不可变对象可以安全地从任何线程使用。 因为它们是不可变的,所以您也可以同时从多个线程中引用它们。 当然,这些对象的可变版本一次只能在一个线程中使用。 |
即使使用线程安全接口来操作文件,当多个线程或多个进程尝试对同一文件执行操作时,仍会出现问题。 尽管存在防止多个客户端同时修改文件的安全措施,但这些安全措施并不总能保证对文件的独占访问。 (也不应该尝试阻止其他进程访问共享文件。)要确保代码知道对共享文件所做的更改,请使用文件协调器来管理对这些文件的访问。
##四、沙盒的使用
1.获取沙盒路径方式
/**
沙盒路径 方式一:
直接使用系统定义的沙盒路径的方法获取沙盒路径
*/
NSString *sandboxStr = NSHomeDirectory() ;
NSString *tempStr = NSTemporaryDirectory();
NSLog(@"\n-----SandBox: %@\n---temp%@",sandboxStr,tempStr);
/**
沙盒路径 方式二:
获得沙盒路径方式二采用SearchPath的方式,NSSearchPathForDirectoriesInDomains是一种文件查找方式,查看沙盒的路径,其中NSSearchPathForDirectoriesInDomains方式有三个参数,三个参数的含义分别如下:
参数1:搜索文件夹路径:NSSearchPathDirectory
常用:NSDocumentDirectory、NSLibraryDirectory、NSCachesDirectory
参数2:用户作用域下搜索
参数3:true代表绝对路径(基本上用决定路径),false代表相对路径
*/
NSArray *userNameArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true);
NSArray *localDomain2 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSLocalDomainMask, true);
NSArray *networkNameArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSNetworkDomainMask, true);
NSArray *sysArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSSystemDomainMask, true);
NSArray *allDomains = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSAllDomainsMask, true);
NSLog(@"-----userDocument:%@\n----locationMake:%@\n----networlMake:%@\n-----sysMake:%@\n----allDomain:%@\n",[userNameArr firstObject],[localDomain2 firstObject],[networkNameArr firstObject],[sysArr firstObject],[allDomains firstObject]);
输出的结果:
-----SandBox: /Users/jack/Library/Developer/CoreSimulator/Devices/9BF127FB-B07B-4B61-995B-C0AF20EACC90/data/Containers/Data/Application/37409917-4796-488E-88ED-12D7DDD2B893
---temp/Users/jack/Library/Developer/CoreSimulator/Devices/9BF127FB-B07B-4B61-995B-C0AF20EACC90/data/Containers/Data/Application/37409917-4796-488E-88ED-12D7DDD2B893/tmp/
-----userDocument:/Users/jack/Library/Developer/CoreSimulator/Devices/9BF127FB-B07B-4B61-995B-C0AF20EACC90/data/Containers/Data/Application/37409917-4796-488E-88ED-12D7DDD2B893/Documents
----locationMake:(null)
----networlMake:(null)
-----sysMake:(null)
----allDomain:/Users/jack/Library/Developer/CoreSimulator/Devices/9BF127FB-B07B-4B61-995B-C0AF20EACC90/data/Containers/Data/Application/37409917-4796-488E-88ED-12D7DDD2B893/Documents
2.沙盒文件
上述打印出来的沙盒路径,通过“command+shift+g”查看沙盒的路径下的组成
总结:
- IOS中数据持久化存储在沙盒中存储
- 沙盒每个路径的功能和作用
- 沙河路径的获取和创建文件存储到沙盒中