美文网首页
OC 数据归档

OC 数据归档

作者: Maj_sunshine | 来源:发表于2017-04-19 17:18 被阅读114次

    数据归档作为一种轻量级的数据存储方式,和属性列表不同之处在于存储的对象广泛,几乎任何类型的对象都能被归档存储且存储是进行加密处理的,归档时会转换和二进制数据,安全性远远高于属性列表。而属性列表只能存储oc基本数据类型和NSArray NSDictionary NSData NSDate NSString 类型。

    使用archiveRootObject 对一个对象进行简单的归档。

     - (void)archiverOne
    {
        // 获取归档文件的路径
        NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"my.archiver"];
        NSLog(@"filePath=%@",filePath);
        // 一个对象的归档方法  返回值为bool类型
        //    BOOL isSuccess = [NSKeyedArchiver archiveRootObject:<#(nonnull id)#> toFile:<#(nonnull NSString *)#>]
        BOOL isSuccess = [NSKeyedArchiver archiveRootObject:@"一个对象归档" toFile:filePath];
        if (isSuccess) {
            NSLog(@"归档成功");
        }
    }
    

    使用NSKeyedUnarchiver的unarchiveObjectWithFile方法解档

    - (void)unArchiverOne
    {
        //获取解档文件路径
        NSString *filepath1 = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"my.archiver"];
        //使用 NSKeyedUnarchiver 进行解档
        [NSKeyedUnarchiver unarchiveObjectWithFile:filepath1];
    }
    

    往往我们不只是要保存一个对象,这时候就要多个对象进行归档解档

    使用NSKeyedArchiver alloc方法中的initForWritingWithMutableData对多个对象进行归档

    - (void)archiverMore // 对多个对象进行归档
    {
        //获取归档路径
        NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"demo.archiver"];
        //初始化一个可变二进制对象  NSMutableData
        NSMutableData *data = [NSMutableData data];
        //初始化归档对象
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
        //对存储的数据进行编码
        [archiver encodeObject:@"summer" forKey:@"season"];
        [archiver encodeInteger:1 forKey:@"count"];
        [archiver encodeObject:[NSArray arrayWithObjects:@"张三",@"李四",@"王五", nil] forKey:@"name"];
        //编码结束 将数据写入二进制对象
        [archiver finishEncoding];
        //将二进制对象存储到文件中
        BOOL isSuccess = [data writeToFile:filePath atomically:YES];
        if (isSuccess) {
            NSLog(@"归档成功 ,path= %@",filePath);
        }
    }
    

    使用NSKeyedArchiver alloc方法中的initForReadingWithData对多个对象进行解档

    - (void)unArchiverMore  // 对多个对象进行解档
    {
        //获取解档档路径
        NSString *filepath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"demo.archiver"];
        //初始化文件中可变二进制对象
        NSMutableData *data = [NSMutableData dataWithContentsOfFile:filepath];
        //初始化解档对象
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
        //接收对应数据
        NSString *season = [unarchiver decodeObjectForKey:@"season"];
        NSInteger count = [unarchiver decodeIntegerForKey:@"count"];
        NSArray *name = [unarchiver decodeObjectForKey:@"name"];
        NSLog(@"secson = %@,count = %li,name = %@",season,count,name);
    }
    

    再有时候,系统的对象不能满足要求,当对象是服务器端传来的json数据解析而来的model时,以上两种都不能保存,这时候就要求自定义对象遵循NSCoding协议,我们实现协议后进行归档解档

    model.h
    #import <Foundation/Foundation.h>
    
    @interface model : NSObject <NSCoding> // 保存自定义对象需遵循NSCoding协议并实现
    @property(nonatomic,copy)NSString *season ;
    @property(nonatomic,copy)NSArray *name;
    @property(nonatomic,assign)NSInteger count;
    @end
    
    model.m
    #import "model.h"
    
    @implementation model
    - (void)encodeWithCoder:(NSCoder *)aCoder //归档保存到文件中的时候调用方法,以下归档三个对象
    {
       [aCoder encodeInteger:self.count forKey:@"count"];
       [aCoder encodeObject:self.season forKey:@"season"];
       [aCoder encodeObject:self.name forKey:@"name"];
    }
    - (instancetype)initWithCoder:(NSCoder *)aDecoder //解档从文件中读取的时候调用方法
    {
       if (self = [super init]) {
           self.name = [aDecoder decodeObjectForKey:@"name"];
           self.season =[aDecoder decodeObjectForKey:@"season"];
           self.count = [aDecoder decodeIntegerForKey:@"count"];
       }
       return self;
    }
    @end
    
    遵循协议后用之前的方法进行归档解档
    - (void)customArchiver  //自定义对象归档
    {
        model *myModel = [[model alloc]init];
        myModel.name = @[@"1",@"2"];
        myModel.count = 10;
        myModel.season = @"summer";
        NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"custom.archiver"];
        NSLog(@"filePath=%@",filePath);
        BOOL isSuccess = [NSKeyedArchiver archiveRootObject:@"一个对象归档" toFile:filePath];
        if (isSuccess) {
            NSLog(@"归档成功");
        }
    }
    
    - (void)customUnArchiver
    {
        NSString *filepath1 = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"custom.archiver"];
        //使用 NSKeyedUnarchiver 进行解档
       model *myModel= [NSKeyedUnarchiver unarchiveObjectWithFile:filepath1];
        if (myModel) {
            NSLog(@"%@,%li,%@", myModel.name, myModel.count, myModel.season);
        }
    }
    

    菜鸟学习第一天

    相关文章

      网友评论

          本文标题:OC 数据归档

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