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

网友评论