UI-senior(数据本地化-如何将复杂对象写入本地)

首先说明归解档是一种编码方式,不是数据本地化的方式,在复杂对象写入本地的时候实际上使用的还是writeToFile 的简单写入本地的方法,且WtiteToFile 直接写入本地,是整存整取的 在一个路径下存数据,最后一次存进去的东西会覆盖掉之前的,下面我们通过上述两内容实现复杂对象的写入.
本文内容:
一.对Foundation框架中的对象进行归档
二.对自定义的对象进行归档
三.对自定义内容进行归档
注意: 归档生成的文件是加密文件(是不可解)

首先创建一个person类

Person.h文件

@interface Person : NSObject
//如果一个对象想实现直接写入本地,那么这个对象就要遵守协议

//声明属性
@property(nonatomic,copy)NSString *name;

@property(nonatomic,copy)NSString *sex;

@property(nonatomic,assign)NSUInteger age;

@end```

###Person.m文件
```code
#import "Person.h"
@implementation Person

//在归档和解档的时候,要把所有的属性都进行归解档
//归档
-(void)encodeWithCoder:(NSCoder *)aCoder{

  [aCoder encodeObject:self.name forKey:@"name"];

  [aCoder encodeObject:self.sex forKey:@"sex"];

  [aCoder encodeInteger:self.age forKey:@"age"];

}

//解档
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
  self = [super init];

   if (self) {

      self.name = [aDecoder decodeObjectForKey:@"name"];

      self.sex = [aDecoder decodeObjectForKey:@"sex"];

      self.age = [aDecoder decodeIntegerForKey:@"age"];

  }

return self;

}
@end```


然后在视图控制器ViewController中操作
###ViewController.m 文件中
```code
#import "ViewController.h"

#import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//如果一个对象想直接写入本地,那么这个对象就要遵守NSCoding协议,上面已经说过,一定记住哦

//获取要存储数据的主路经(具体参数前面有解释)
NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

//创建Person对象,做存储的数据
Person *person = [[Person alloc] init];
person.name = @"班长";
person.sex = @"女";
person.age = 10;

#pragma mark-----对自定义对象进行归档和反归档----
//第一步:创建一个NSMutableData 用于初始化归档工具
NSMutableData *data = [NSMutableData data];

//第二步:创建一个归档工具
NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

//第三步:使用归档工具 对需要归档的对象进行归档
[keyedArchiver encodeObject:person forKey:@"person"];

NSLog(@"---%@",data);

//第四步:结束归档(只有在结束归档之后数据才能得到有效保存)
[keyedArchiver finishEncoding];

NSLog(@"---%@",data);

//写入文件(确定具体的文件)
NSString *dataPath = [documentPathStr stringByAppendingPathComponent:@"data.plist"];

//写入文件(写入)
[data writeToFile:dataPath atomically:YES];

NSLog(@"%@",documentPathStr);

#pragma mark-----解档---
//第一步:从本地获取到的Data
NSData *newData = [NSData dataWithContentsOfFile:dataPath];
NSLog(@"newData = %@",newData);

//第二步:通过获取到的data,创建解档工具
NSKeyedUnarchiver *keyedUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:newData];

//第三步:创建一个person对象,接收解档结果
Person *newPerson = [keyedUnarchiver decodeObjectForKey:@"person"];

//第四步:结束解档
[keyedUnarchiver finishDecoding];
NSLog(@"person =====%@",newPerson.name);


//对Foundation框架中的对象进行归档和反归档
[self  foundationClass]

//对自定义内容进行归档和反归档
[self  customContent]

}

#pragma mark ------- 对Foundation框架中的对象进行归档和反归档 --------
- (void)foundationClass{
//归档(以数组为例说明)
    //1. 创建路径
    NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    
    //2. 拼接一个文件
    NSString *filePath = [document stringByAppendingString:@"/file.plist"];
    
    //3. 创建归档对象
    NSArray *array = @[@"C", @"OC", @"UI"];
    
    //4. 归档
    //archiveRootObject: 对基本数据类型数据进行归档的方法
    BOOL result = [NSKeyedArchiver archiveRootObject:array toFile:filePath];
    
    if (result) {
        
        NSLog(@"array归档成功:%@", filePath);
    }
    
    //5. 不需要结束
    
//反归档
    //1. 创建对象用来接收
    NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"解档结果 = %@", newArray);
    
    
}

#pragma mark ------- 对自定义内容进行归档和反归档 --------
- (void)customContent{
//归档
    //1. 获取路径
    NSString *custonPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
    custonPath = [custonPath stringByAppendingString:@"/customFile"];
    
    //2. 使用Data对象存放归档数据
    NSMutableData *data = [NSMutableData data];
    
    //3. 创建归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    
    //4. 对自定义内容进行归档
    [archiver encodeObject:@"尼古拉斯.赵四" forKey:@"name"];
    [archiver encodeObject:@"男" forKey:@"gender"];
    [archiver encodeInt:22 forKey:@"age"];
    
    [archiver encodeObject:@[@"AAAA", @"BBBB", @"CCCC"] forKey:@"array"];
    
    //5. 完成归档
    [archiver finishEncoding];
    
    //6. 写入本地
    BOOL result = [data writeToFile:custonPath atomically:YES];
    if (result) {
        NSLog(@"写入成功: %@", custonPath);
    }
 
#warning <#message#>
//反归档:
    
    //1. 读取文件, 转化成NSData对象类型
    NSData *unarchiverData = [NSData dataWithContentsOfFile:custonPath];
   
    //2. 创建反归档对象
    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];
  
    //3. 反归档(根据KEY值访问)
    NSString *str = [unArchiver decodeObjectForKey:@"name"];
    
    NSLog(@"%@", str);
}

@end```

你可能感兴趣的:(UI-senior(数据本地化-如何将复杂对象写入本地))