美文网首页IOSiOS DeveloperiOS 开发
封装数据归档和解归档

封装数据归档和解归档

作者: SPIREJ | 来源:发表于2016-01-27 16:10 被阅读219次

性能完善,使用简单。


图1 - 效果示例
过程:
    1. 建立一个模型,一般即为你要存储数据的模型,我这里是用户数据。
      ~1.1 模型的数据类型,模型要遵守<NSCoding>
      @property(nonatomic, copy)NSString *userName;
      @property(nonatomic, copy)NSString *userPhone;
      @property(nonatomic, assign)NSInteger userAge;
      + (SJUserModel *)userWithName:(NSString *)name age:(NSInteger)age phone:(NSString *)phone;
      ~1.2 实现模型赋值方法
      + (SJUserModel *)userWithName:(NSString *)name age:(NSInteger)age phone:(NSString *)phone
      {
      SJUserModel *model = [[self alloc] init];
      model.userName = name;
      model.userAge = age;
      model.userPhone = phone;
      return model;
      }
      ~1.3 实现归档自动触发 和 解归档自动触发方法
      - (void)encodeWithCoder:(NSCoder *)aCoder{
      //保存值
      [aCoder encodeObject:self.userName forKey:@"userName"];
      [aCoder encodeObject:self.userPhone forKey:@"userPhone"];
      [aCoder encodeInteger:self.userAge forKey:@"userAge"];
      }

      - (instancetype)initWithCoder:(NSCoder *)aDecoder{
        if (self = [super init]) {
         //取值
         self.userName = [aDecoder decodeObjectForKey:@"userName"];
         self.userPhone = [aDecoder decodeObjectForKey:@"userPhone"];
         self.userAge = [aDecoder decodeIntegerForKey:@"userAge"];
         }
      return self;
      }
      

  • 2.建立归档类
    ~2.1 声明外部接口方法
    /用户信息归档/
    + (void)archiverUserInfo:(SJUserModel )model;
    /
    用户信息读档/
    + (SJUserModel )currentArchiverUserInfo;
    ~2.2 具体实现归档、解归档部分
    /
    归档/
    + (void)archiverUserInfo:(SJUserModel )model{
    [self archiverModel:model fileName:kUserInfoFileName dataName:kUserInfoDataKey];
    }
    /
    解归档/
    +(SJUserModel )currentArchiverUserInfo{
    //如果内存中有UserModel,直接读取,否则去磁盘读取
    if ([self memoryUserInfo] != nil) {
    return [self memoryUserInfo];
    }
    return [self unArchiverWithFieldName:kUserInfoFileName dataName:kUserInfoDataKey];
    }
    /
    获取当前内存中的用户信息/
    + (SJUserModel )memoryUserInfo{
    AppDelegate delegate = [UIApplication sharedApplication].delegate;
    return delegate.currentUserModel;
    }
    /
    路径
    /
    + (NSString *)filePathComponentName:(NSString *)fileName{
    return [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0] stringByAppendingPathComponent:fileName];
    }
    + (void)archiverModel:(NSObject *)model fileName:(NSString *)fileName dataName:(NSString *)dataName{
    NSString *dataFilePath = [self filePathComponentName:fileName];
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

      [archiver encodeObject:model forKey:dataName];
      [archiver finishEncoding];
      [data writeToFile:dataFilePath atomically:YES];
    }
    
    + (id)unArchiverWithFieldName:(NSString *)fileName dataName:(NSString *)dataName{
      NSString *filePath = [self filePathComponentName:fileName];
      NSData *data = [[NSMutableData alloc] initWithContentsOfFile:filePath];
      NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
      id model = [unarchiver decodeObjectForKey:dataName];
      [unarchiver finishDecoding];
      if (model == nil) {
      NSLog(@"读档信息为空");
      }
      return model;
    }
    

  • 3.至此,封装完毕。使用部分
    ~3.1 登录时给模型赋值,归档模型数据
    <pre>SJUserModel *userModel = [SJUserModel userWithName:self.nameTF.text age:self.ageTF.text.integerValue phone:self.phoneTF.text];
    [SJArchive archiverUserInfo:userModel];</pre>~3.2下一次进APP时从内存中或者磁盘解归档数据
    <pre>SJUserModel *model = [SJArchive currentArchiverUserInfo];
    self.nameLB.text = model.userName;
    self.ageLB.text = [NSString stringWithFormat:@"%ld",model.userAge];
    if ([self.ageLB.text isEqualToString:@"0"])
    self.ageLB.text = @"";
    }
    self.phoneLB.text = model.userPhone;</pre>
    ~3.2退出登录时,给当前用户数据模型置"空",然后归档一次"空"模型
    <pre>SJUserModel *model = [SJArchive currentArchiverUserInfo];
    model.userName = @"";
    model.userPhone = @"";
    model.userAge = @"".integerValue;
    //归档
    [SJArchive archiverUserInfo:model];</pre>

希望本文会对看到的同学有帮助,原文代码参考:https://github.com/SPIREJ/SJArchiveDemo

相关文章

  • 封装数据归档和解归档

    性能完善,使用简单。图1 - 效果示例 过程: 建立一个模型,一般即为你要存储数据的模型,我这里是用户数据。~1....

  • 归档(NSKeyedArchiver)与解归档(NSKeyUna

    NSKeyedAchiver&NSKeyUnarchiver的封装 归档和解归档是App数据持久化的方法之一。 归...

  • iOS NSKeyedArchiver数据归档

    iOS中利用NSKeyedArchiver和NSKeyedUnarchiver进行数据的归档和解档操作。 归档 所...

  • 归档和解归档

    基本数据持久化:把OC中的基本数据存储到沙盒中。归档:把复杂类型转为data类型的过程。解归档:把data类型转为...

  • 数据的存储和应用程序的沙盒

    一、数据的存储 1、沙盒 2、NSUserDefaults 3、归档 自定义的类归档和解档要遵守NSCoding协...

  • iOS 归档和解归档

    归档与解档是IOS中一种序列化与反序列化的方式。对象要实现序列化需要遵循NSCoding协议,而绝大多数Found...

  • iOS. swift 本地数据归档和解档

    iOS. swift 本地数据归档和解档 userDataModel 文件 代码: class MyModel: ...

  • iOS-归档NSCoding序列化

    归档 归档->数据持久化的方式->加密(把文件加密《不是把数据加密》 归档分为: 1、存储数据(编码、序列化、归档...

  • iOS 归档NSKeyedArchiver

    一、归档NSKeyedArchiver和解归档NSKeyedUnarchiver 1.首先确定存储路径。 NSHo...

  • 数据持久化-归档、解档

    模型对象实现归档和解档代理方法 解档 宏定义路径 归档 任何地方只要动了数组都要归档

网友评论

    本文标题:封装数据归档和解归档

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