归档、解归档
一、沙盒
1、iOS的沙盒(sandbox)机制:是一种安全体系,iOS应用程序只能对自己创建的应用程序进行读取文件,这个独立、封闭、安全的空间,就是沙盒。它里面一般存放着你的程序需要的数据持久化的一些文件(Plist、sqlite...)音视频、图片以及其他资源文件。
注:每一个应用程序只有一个沙盒
2、沙盒里面有三个文件:
1)Documents:目录下的内容会被同步到另一台设备(可以放媒体资源、文本资源)
2)Library:可以把缓存的内容放到Library/Caches
3)tmp:创建临时文件的目录,当我们的设备重启时,文件会被自动清除
二、获得目录的方法:
1、获得根目录的方式
NSString *homePath = NSHomeDirectory();
NSLog(@"%@", homePath);
2、获得Documents目录的方式
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths firstObject];
NSLog(@"%@", documentPath);
3、获得Library目录
NSArray *paths2 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryPath = [paths2 lastObject];
NSLog(@"%@", libraryPath);
4、获得Caches目录
NSArray *paths3 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesPath = [paths3 lastObject];
NSLog(@"%@", cachesPath);
5、临时文件目录Tmp
NSString *tmpPath = NSTemporaryDirectory();
NSLog(@"%@", tmpPath);
三、归档、解归档
归档:NSKeyedArchiver
解归档:NSKeyedUnarchiver
1)归档又叫系列化(coding)
2)归档之后的文件会被加密
3)可以归档的文件、数据:任何数据(直接归档一个类实例化的对象、数组、字典、字符串、文本、图片······)
1、第一种归档方式:
归档步骤:
1)归档路径,需要归档的数据
2)归档、解归档
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths firstObject];
注:拼接归档文件的路径
NSString *path = [documentPath stringByAppendingPathComponent:@"userList.archiver"];
NSArray *user = @[@"刘备", @"关羽", @"张飞"];
BOOL success = [NSKeyedArchiver archiveRootObject:user toFile:path];
if (success) {
[self showAlertWithMessage:@"归档成功"];
}
NSLog(@"%@", path);
解归档:
1)解归档的文件路径
2)解归档
NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path1 = [[paths1 lastObject] stringByAppendingPathComponent:@"userList.archiver"];
NSArray *list = [NSKeyedUnarchiver unarchiveObjectWithFile:path1];
for (NSString *name in list) {
NSLog(@"%@", name);
}
2、第二种归档方式
NSData:二进制数据的一个类
归档二:
1)归档文件路径 准备需要归档的数据
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"userList1.archiver"];
NSArray *list = @[@"刘备", @"孙权", @"曹操"];
NSDictionary *dic = @{@"key":@"value"};
2)写一个NSMutableData 通过归档的类 让NSData写入到文件
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archive = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
3、开始编码(归档)(编码的key和解码时的key一定要统一)
[archive encodeObject:list forKey:@"list"];
[archive encodeObject:dic forKey:@"dic"];
4、结束编码(归档) 把Data数据写入到文件
[archive finishEncoding];
BOOL success = [data writeToFile:path atomically:YES];
if (success) {
[self showAlertWithMessage:@"归档成功啦~"];
}
注:
atomically如果设置为YES的时候,在写入数据时,如果出现意外情况(用户突然强制退出了应用程序、断电······),会把写入到临时文件的内容清空掉,不在写入到目标文件
atomically 如果设置为NO,不管数据是否完整,都会直接写入到目标文件
解归档二:
1、文件路径
NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path3 = [[paths1 lastObject] stringByAppendingPathComponent:@"userList1.archiver"];
2、读取文件里面data数据
NSData *data3 = [NSData dataWithContentsOfFile:path3];
3、通过解归档对象 读取data数据,准备解归档
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data3];
4、解归档数据(解码)
NSArray *arr = [unArchiver decodeObjectForKey:@"list"];
NSDictionary *dic1 = [unArchiver decodeObjectForKey:@"dic"];
for (NSString *name in arr) {
NSLog(@"%@", name);
}
NSLog(@"%@", dic1);
3、想归档自定义类的对象
步骤:
1、遵守NSCoding协议
2、实现归档协议里面的方法
3、逐一对自定义类里面的属性 进行了 编码和解码,这时候这个对象就具备了归档、解归档的功能
4、开始归档、解归档
归档:
NSArray *path2 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[path2 lastObject] stringByAppendingPathComponent:@"UserModel.archive"];
UserModel *model = [[UserModel alloc]init];
model.name = @"王羲之";
model.age = 18;
BOOL success = [NSKeyedArchiver archiveRootObject:model toFile:path];
if (success) {
[self showAlertWithMessage:@"警告:电脑死机了,是否重新启动?"];
}
解归档:
NSArray *path2 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[path2 lastObject] stringByAppendingPathComponent:@"UserModel.archive"];
UserModel *model = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@, %ld", model.name, model.age);