iOS 持久化之归档 小结

作者: 凉风起君子意如何 | 来源:发表于2017-01-23 17:45 被阅读87次

题外话

今天是农历腊月二十六啦,马上就快过年了,其实在我们老家,今天晚上就要过大年了(我们村那的风俗就是腊月二十六过大年,年三十过小年)。过年了,新的一年离我们越来越近,真心祝愿爸妈在新的一年里身体健康,万事都顺心如意,平时不要光顾着忙活挣钱,你女儿儿子们都已经长大成人,该为自己为家庭承担起应有的责任了。在这里也衷心祝愿天下所有的爸爸妈妈身体健康,笑口常开,好人一生平安幸福。啰嗦了两句,赶时间的请忽略哦😝

写在前面

参考链接

iOS本地数据持久化 一共有四种方法
1.SQLite数据库
2.NSKeyedArchiver (归档)
3.preference (偏好设置 即NSUserDefaults)
4.CoreData(未完待续)

今天 先写归档小结,后续会更新其它的。

正题

大致的分为如下几个步骤:

  • 创建相应的模型实体,遵守NScoding协议。部分代码如下(github下载😝):

#import <Foundation/Foundation.h>

@interface ContactModel : NSObject<NSCoding>
@property (strong, nonatomic)NSString *name;
@property (strong, nonatomic)NSString *mobile;

//这两个是归档/解档 某个单一的model
-(void)archiverWithContactModel:(ContactModel *)contact;
+(ContactModel *)unarchiver;

//下面这两个是对model数组进行归档和解档
+ (void)archiverWithContactList:(NSMutableArray *)contacts;
+ (NSMutableArray *)unarchiverList;
@end

上面是h文件,下面来看看m文件,主要实现initWithCoder和encodeWithCoder两个方法

- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        _name = [aDecoder decodeObjectForKey:name];
        _mobile = [aDecoder decodeObjectForKey:mobile];
    }
    
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:_name forKey:name];
    [aCoder encodeObject:_mobile forKey:mobile];
}
  • 模型数组归档

#pragma mark  --复杂对象数组写入文件
+ (void)archiverWithContactList:(NSMutableArray *)contacts{
    //1:准备存储数据的对象
    NSMutableData *data = [NSMutableData data];
    //2:创建归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //3:开始归档
    [archiver encodeObject:contacts forKey:@"contact"];
    //4:完成归档
    [archiver finishEncoding];
    //5:写入文件当中
    BOOL result = [data writeToFile:FilePath atomically:YES];
    if (result) {
        NSLog(@"归档成功:%@",FilePath);
    }else
    {
        NSLog(@"归档不成功!!!");
    }
}
  • 模型数组解档

#pragma mark ---  反归档/反序列化/解码/解档 ----
+ (NSMutableArray *)unarchiverList{
    NSData *myData = [NSData dataWithContentsOfFile:FilePath];
    //这个判断要加上,vc第一次加载数据源的时候,这个是读不到东西的,若程序再往下走的话势必会导致奔溃
    if (!myData) {
        return nil;
    }
    //创建反归档对象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:myData];
    //反归档
    NSMutableArray *contacts = [NSMutableArray array];
    contacts = [unarchiver decodeObjectForKey:@"contact"];
    //完成反归档
    [unarchiver finishDecoding];
    
    return contacts;
}
  • 归档使用

#pragma mark - Navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    AddContactVC *vc = [segue destinationViewController];
    //block传值
    vc.addContactBlock = ^(ContactModel *contact){
        [self.datalist addObject:contact];
        //模型数组归档
        [ContactModel archiverWithContactList:self.datalist];
        [self.tableView reloadData];
    };
}
  • 解档使用

//懒加载数据源
-(NSMutableArray *)datalist{
    if (!_datalist) {
        _datalist = [NSMutableArray array];
        if ([ContactModel unarchiverList]) {
            _datalist = [ContactModel unarchiverList];
        }
    }
    return  _datalist;
}

当调用NSKeyedArchiver的时候,系统会去调用你的encodeWithCode。当时使用NSKeyedUnarchiver,系统回去调用initWithCoder。归档简单的理解就是把你的实体对象压缩归档到一个文件里,相反解档就是从你设置那个文件里面读出之前保存的数据。
时间仓促,简单记录下,望见谅!详看AdressBookDemo

补充知识

终端命令上传本地项目到github

参考链接

  • 初始化本地仓库

$ git init
$ git add .
$ git commit -m "first commit"

  • 与github建立连接

登录github创建跟项目相同名称的资源库

终端输入如下命令:

$ remote add origin https://github.com/caohuoxia/AdressBookDemo.git

  • 上传到github

$ git push -u origin master

敲如如上命令之后,出现授权失败问题,如下截图解决ok

End

相关文章

  • iOS 持久化之归档 小结

    题外话 今天是农历腊月二十六啦,马上就快过年了,其实在我们老家,今天晚上就要过大年了(我们村那的风俗就是腊月二十六...

  • 面试技巧攻克-iOS中数据持久化

    一、持久化方案 1、iOS中有哪些持久化方案? (1)NSuserDefault(2)Plist(3)归档(序列化...

  • iOS中的持久化&&数据库基本操作

    一、数据持久化的几种方法 在iOS中将数据持久化总共有四招: 1. 归档(Archiver)、解归档(unArch...

  • iOS数据持久化方式

    iOS数据持久化方式 文件 归档(NSKeyedArchiver) 属性列表(NSUserDefaults) 数据...

  • 归档-解归档

    归档-解归档 在iOS开发中,数据持久化方法很多,比如:SQL、KeyChina、CoreData、NSUserD...

  • iOS基础--数据本地化-归解档-整理总结(2)

    iOS数据持久化方法: 属性列表 (plist文件), 用 NSUserDefault 归档 (NSKeyedAr...

  • iOS数据存储(一)

    iOS开发常用的数据持久化方式有NSUserdefaults(属性列表),NSKeyedArchiver(归档/解...

  • ios 数据持久化之--- 归档

    归档实现序列化机制 用某种格式把对象保存在指定文件 方便以后文件恢复1 把对象写入指定文件 归档2 把这种形式...

  • iOS数据持久化之归档

    如果我们需要对一个对象进行保存的话,我们就需要使用到归档 -- NSKeyedArchiver 下面从一个简单的例...

  • iOS数据持久化

    iOS数据持久化 iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置)...

网友评论

    本文标题:iOS 持久化之归档 小结

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