归解档

作者: 天蓬大元 | 来源:发表于2018-02-02 15:46 被阅读0次

归解档操作的对象必须遵守<NSCoding>,因为归解档是通过该协议实现的。无论是系统的类还是我们自定义的类,想要进行归解档操作,就必须要遵守该协议。本文我们以自定义类为例子,对归解档进行基本的解读。

一,归档

什么是归档,归档就是将当前对象转化为二进制数据并存储到指定的文件中。
来来来,热乎的代码
我们将归档数据存储在Documents文件夹中的data.txt文件中
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); 
NSString *path = [paths objectAtIndex:0];  
NSString *prePath = [path stringByAppendingPathComponent:@"/data.txt"];
在开始归档之前,我们必须保证我们操作的自定义类是可以归档的。
自定义Person类
#import <Foundation/Foundation.h>
//遵守归档协议<NSCoding>
@interface Person : NSObject<NSCoding>
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)NSInteger age;
@end

#import "Person.h"
@implementation Person
//归档,实现归档协议的方法
- (void)encodeWithCoder:(NSCoder *)coder
{
    NSLog(@"进入归档");
    //将name属性进行归档;key自定义,解档时要完全匹配
    [coder encodeObject:_name forKey:@"name"];
    [coder encodeInteger:_age forKey:@"age"];
}
//解档,实现解档协议的方法
- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [[Person alloc] init];
    if (self) {
        NSLog(@"进入解档");
        //获取解档的属性值
        self.name = [coder decodeObjectForKey:@"name"];
        self.age = [coder decodeIntegerForKey:@"age"];
    }
    return self;
}
@end
我们接下来的归档操作,就是针对Person的一个对象进行
//先创建一个对象,并对其属性进行赋值。
Person *xiaoM = [[Person alloc] init];
xiaoM.name = @"xiaoMing";
xiaoM.age  = 18;
//NSKeyedArchiver:归档
//参数1: 归档内容  参数2: 归档的路径
//archiveRootObject:归档到文件->encodeWithCoder
if([NSKeyedArchiver archiveRootObject:xiaoM toFile: prePath])
{
    NSLog(@"归档成功");
}

二,解档

//NSKeyedUnarchiver:  接档类
//unarchiveObjectWithFile: 从文件中获取对象->initWithCoder
Person *obj = [NSKeyedUnarchiver unarchiveObjectWithFile: prePath];

三,归解档数据流

//归档到数据流->encodeWithCoder
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:xiaoM];
Person *obj2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];

四,实际场景

如果你将多个模型对象存储到数组中,只需将该数组进行归档,系统会自动对每个模型对象进行归档。解档时,首先得到的是一个数组,数组中包含了我们之前存放的模型对象

Dome

相关文章

网友评论

      本文标题:归解档

      本文链接:https://www.haomeiwen.com/subject/hfkezxtx.html