当前位置: 首页 > news >正文

iOS 对模型对象进行归档

归档是指一种形式的序列化,专门编写用于保存数据的任何对象都应该支持归档。使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们。

只要在类中实现的每个属性都是标量或者都是遵循NSCoding协议的某个类的实例,你就可以对整个对象进行完全归档。大多数的Foundation和Cocoa Touch类 都遵NSCoding协议,所以对于有大多数类来说,归档不太难。

 

遵循NSCoding协议:

NSCoding声明了两个方法,

- (void)encodeWithCoder:(NSCoder *)aCoder;和- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;

第一个是 将对象编码到归档中,第二个则是对归档解码,来创建一个对象。

在BIDFourLines中:

#import <Foundation/Foundation.h>

@interface BIDFourLines : NSObject <NSCoding, NSCopying>

@property (copy, nonatomic) NSArray *lines;

@end

 

#import "BIDFourLines.h"

static NSString * const kLinesKey = @"kLinesKey";

@implementation BIDFourLines 

#pragma mark - Coding

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        self.lines = [aDecoder decodeObjectForKey:kLinesKey];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder;
{
    [aCoder encodeObject:self.lines forKey:kLinesKey];
}

#pragma mark - Copying

- (id)copyWithZone:(NSZone *)zone;
{
    BIDFourLines *copy = [[[self class] allocWithZone:zone] init];
    NSMutableArray *linesCopy = [NSMutableArray array];
    for (id line in self.lines) {
        [linesCopy addObject:[line copyWithZone:zone]];
    }
    copy.lines = linesCopy;
    return copy;
}

@end

注:上面遵循了NSCopying协议,遵循NSCopying协议对于任何模型对象来说都是非常好的事情,NSCopying协议中,有一个copyWithZone方法,可以用来复制对象。

 

在BIDViewController中:

#import "BIDViewController.h"
#import "BIDFourLines.h"

static NSString * const kRootKey = @"kRootKey";

@interface BIDViewController ()

@property (strong, nonatomic) IBOutletCollection(UITextField) NSArray *lineFields;

@end

@implementation BIDViewController

- (NSString *)dataFilePath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(
                                                         NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:@"data.archive"];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSString *filePath = [self dataFilePath];
    //如果存在归档
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        NSData *data = [[NSMutableData alloc]
                        initWithContentsOfFile:filePath];
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
                                         initForReadingWithData:data];
        //解档
        BIDFourLines *fourLines = [unarchiver decodeObjectForKey:kRootKey];
        
        [unarchiver finishDecoding];
        
        for (int i = 0; i < 4; i++) {
            UITextField *theField = self.lineFields[i];
            theField.text = fourLines.lines[i];
        }
    }
    
    //后台通知
    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(applicationWillResignActive:)
     name:UIApplicationWillResignActiveNotification
     object:app];
}


//进入后台时 归档
- (void)applicationWillResignActive:(NSNotification *)notification
{
    NSString *filePath = [self dataFilePath];
    BIDFourLines *fourLines = [[BIDFourLines alloc] init];
    fourLines.lines = [self.lineFields valueForKey:@"text"];
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]
                                 initForWritingWithMutableData:data];
    [archiver encodeObject:fourLines forKey:kRootKey];
    [archiver finishEncoding];
    [data writeToFile:filePath atomically:YES];
}

 

相关文章:

  • TopN算法与排行榜
  • Servlet 生命周期、工作原理
  • POJ 2375
  • 关于SQL镜像配置报错
  • 共享库
  • Oracle 函数返回表实例2种写法实例
  • 重走java--Step 2
  • 高并发系统之队列术
  • servlet 开发出错原因分析
  • java--集合框架
  • 粗浅看Struts2和Hibernate框架
  • Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
  • jquery内容选择器(匹配包含指定选择器的元素)
  • Unity3D Shader入门指南(转)
  • 文件上传大小限制问题
  • .pyc 想到的一些问题
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 4. 路由到控制器 - Laravel从零开始教程
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • eclipse的离线汉化
  • EventListener原理
  • Fundebug计费标准解释:事件数是如何定义的?
  • java 多线程基础, 我觉得还是有必要看看的
  • JSONP原理
  • Laravel 实践之路: 数据库迁移与数据填充
  • Linux后台研发超实用命令总结
  • Rancher-k8s加速安装文档
  • React-生命周期杂记
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 闭包--闭包作用之保存(一)
  • 多线程 start 和 run 方法到底有什么区别?
  • 看域名解析域名安全对SEO的影响
  • 试着探索高并发下的系统架构面貌
  • 数组的操作
  • 算法-插入排序
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #Linux(make工具和makefile文件以及makefile语法)
  • %@ page import=%的用法
  • (+4)2.2UML建模图
  • (2)STL算法之元素计数
  • (9)目标检测_SSD的原理
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三)uboot源码分析
  • .bat批处理(一):@echo off
  • .gitignore文件_Git:.gitignore
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET 的程序集加载上下文
  • .net反混淆脱壳工具de4dot的使用
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)