归档、解归档

归档、解归档

一、沙盒

1、iOS的沙盒(sandbox)机制:是一种安全体系,iOS应用程序只能对自己创建的应用程序进行读取文件,这个独立、封闭、安全的空间,就是沙盒。它里面一般存放着你的程序需要的数据持久化的一些文件(Plistsqlite...)音视频、图片以及其他资源文件。

注:每一个应用程序只有一个沙盒

 

2、沙盒里面有三个文件:

 1)Documents:目录下的内容会被同步到另一台设备(可以放媒体资源、文本资源)

 2Library:可以把缓存的内容放到Library/Caches

 3tmp:创建临时文件的目录,当我们的设备重启时,文件会被自动清除


二、获得目录的方法:

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值