iOS数据库之一: 沙盒的详细讲解

** 前言:**
处于安全考虑:在iOS平台上,每个app都有一个存储空间,用以存储照片、声音文件、文本、属性列表等,我们称之为沙盒。在沙盒里,app可以自己读写文件,但仅限于自己的沙盒,不可访问其他app沙盒,不可进行相互间通信(也有例外,比如在用户授权情况下访问通讯录,相册等)
一、沙盒目录结构(苹果官方文档
在这里插入图片描述
在这里插入图片描述

NSString *path = NSHomeDirectory();

上面的代码得到的是应用程序目录的路径,在该目录下有三个文件夹:Documents、Library、temp以及一个.app包!该目录下就是应用程序的沙盒,应用程序只能访问该目录下的文件夹!!!
1、Documents 目录:使用此目录存储用户生成的内容。该目录的内容可以通过文件共享提供给用户;因此,他的目录应该只包含您可能希望向用户公开的文件。
这个目录的内容由iTunes和iCloud备份。
2、AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
3、Library 目录:这个目录下有两个子目录:
Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.
Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份。
4、tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。该路径下的文件不会被iTunes备份。

二、存储app数据原则:

为了防止iOS设备上的同步和备份过程花费很长时间,请选择文件的存放位置。存储大文件的应用程序会减慢备份到iTunes或iCloud的速度。这些应用程序还会消耗大量用户可用的存储空间,这可能会鼓励用户删除该应用程序,或禁止将该应用程序的数据备份到iCloud

  • Put user data in Documents/:

将用户数据放入文档/中。用户数据通常包括您可能希望向用户公开的任何文件—您可能希望用户创建、导入、删除或编辑的任何文件。对于绘图应用程序,用户数据包括用户可能创建的任何图形文件。对于文本编辑器,它包括文本文件。视频和音频应用程序甚至可能包括用户下载后观看或收听的文件。

  • Put app-created support files in the Library/Application support/ directory:
    将应用程序创建的支持文件放在库/应用程序支持/目录中。一般来说,这个目录包含应用程序用来运行的文件,但是这些文件应该对用户保持隐藏。该目录还可以包含数据文件、配置文件、模板和从app bundle中加载的资源的修改版本。

  • Remember that files in Documents/ and Application Support/ are backed up by default:
    您可以使用NSURLIsExcludedFromBackupKey键调用-[NSURL setResourceValue:forKey:error:]来从备份中排除文件。任何可以重新创建或下载的文件都必须从备份中排除。这对于大型媒体文件尤其重要。如果您的应用程序下载视频或音频文件,请确保它们不包含在备份中。

  • Put temporary data in the tmp/ directory:
    临时数据包括您不需要长时间保存的任何数据。记住,当您处理完这些文件时,请删除它们,这样它们就不会继续占用用户设备上的空间。系统会定期清除这些文件时,你的应用程序不运行;因此,在应用程序终止后,您不能依赖于这些文件的持久性。

  • Put data cache files in the Library/Caches/ directory:
    缓存数据可以用于任何需要比临时数据持久时间更长的数据,但不能与支持文件一样长。一般来说,应用程序不需要缓存数据来正常运行,但是它可以使用缓存数据来提高性能。缓存数据的示例包括(但不限于)数据库缓存文件和临时的可下载内容。请注意,系统可能会删除缓存/目录以释放磁盘空间,因此您的应用程序必须能够根据需要重新创建或下载这些文件。

三、获取各种文件目录的路径
获取目录路径的方法:

// 获取沙盒主目录路径
NSString *homeDir = NSHomeDirectory();
// 获取Documents目录路径
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
// 获取Library的目录路径
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
// 获取Caches目录路径
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
// 获取tmp目录路径
NSString *tmpDir =  NSTemporaryDirectory();

获取应用程序程序包中资源文件路径的方法:

NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];

三、NSSearchPathForDirectoriesInDomains
NSSearchPathForDirectoriesInDomains方法用于查找目录,返回指定范围内的指定名称的目录的路径集合。有三个参数:
** directory ** NSSearchPathDirectory类型的enum值,表明我们要搜索的目录名称,比如这里用NSDocumentDirectory表明我们要搜索的是Documents目录。如果我们将其换成NSCachesDirectory就表示我们搜索的是Library/Caches目录。
** * domainMask* ** NSSearchPathDomainMask类型的enum值,指定搜索范围,这里的NSUserDomainMask表示搜索的范围限制于当前应用的沙盒目录。还可以写成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。
** * expandTilde* ** BOOL值,表示是否展开波浪线。我们知道在iOS中的全写形式是/User/userName,该值为YES即表示写成全写形式,为NO就表示直接写成“~”。
该值为NO:Caches目录路径~/Library/Caches
该值为YES:Caches目录路径
/var/mobile/Containers/Data/Application/E7B438D4-0AB3-49D0-9C2C-B84AF67C752B/Library/Caches

五:文件、并发性和线程安全
由于与文件相关的操作涉及到与硬盘的交互,因此与大多数其他操作相比速度较慢,因此iOS和macOS中的大多数与文件相关的接口在设计时都考虑到了并发性。有几种技术将异步操作合并到它们的设计中,而其他大多数技术可以从分派队列或辅助线程安全地执行。表1-4列出了本文档中讨论的一些关键技术,以及从特定线程或任何线程使用这些技术是否安全。有关任何接口功能的特定信息,请参阅该接口的参考文档。
NSFileManager:对于大多数任务,从多个后台线程同时使用默认的NSFileManager对象是安全的。此规则的唯一例外是与文件管理器委托交互的任务。当将文件管理器对象与委托一起使用时,建议您创建NSFileManager类的唯一实例,并将委托与该实例一起使用。然后,您应该一次从一个线程使用惟一的实例。
GCD:从任何线程使用GCD本身都是安全的。但是,您仍然要负责以线程安全的方式编写您的块。
NSFileHandle, NSData, Cocoa streams:用于读写文件数据的大多数基础对象可以从任何单个线程使用,但不应该同时从多个线程使用。
NSURL and NSString:用于指定路径的不可变对象可以安全地从任何线程使用。因为它们是不可变的,所以您也可以同时从多个线程引用它们。当然,这些对象的可变版本一次只能在一个线程中使用。
NSEnumerator and its subclasses:枚举器对象在任何单个线程中使用都是安全的,但不应同时在多个线程中使用。

即使使用线程安全的接口来操作文件,当多个线程或多个进程试图对同一个文件执行操作时,仍然会出现问题。尽管有一些保护措施可以防止多个客户机同时修改文件,但这些保护措施并不总是保证始终对文件的独占访问。(也不应该试图阻止其他进程访问共享文件。)确保您的代码知道对shared所做的更改(The Role of File Coordinators and Presenters

发布了128 篇原创文章 · 获赞 106 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/Z1591090/article/details/88367025
今日推荐