iOS 持久化之归档 小结

题外话

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

写在前面

参考链接

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

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

正题

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

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

#import 

@interface ContactModel : NSObject
@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创建跟项目相同名称的资源库

iOS 持久化之归档 小结_第1张图片

终端输入如下命令:

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

  • 上传到github

$ git push -u origin master

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

iOS 持久化之归档 小结_第2张图片

End

你可能感兴趣的:(iOS 持久化之归档 小结)