终结一下iOS的对象归档问题.
1:这个对象为什么需要归档
2:使用归档的时候需要注意什么
3:归档以后写进本地,取出
4:使用
一步步解决问题开始:
1:为什么要用呢? 因为数据可以不用每次到网路请求就可以直接拿到啊.方便啊.就比如说userInfoModel类,这个app运行完事以后,下次需要直接自动登录,登录之前是不是有什么头像的url啊,还有各种信息判断啊,这个时候就不合适NSUserDefaults了,可以直接把userInfoModel类进行归档
2:需要经历怎么样的过程才可以进行归档呢?这是个问题!
第一步:当然是先有userInfoModel类了,自己创建一个
第二部:当然是这个userInfoModel类需要实现NSCoding协议啦,然后是实现两个必要方法了
方法一:encodeWithCoder:(NSCoder *)aCoder
在此方法中需要对每个属性进行encode,encode有多种属性类型encodeBool,encodeInt,encodeObject…….
方法二:initWithCoder:(NSCoder *)aDecoder
在此方法中需要对每个属性进行decode,decode有多种属性类型decodeBool,decodeInt,decodeObject……..
(ps一定要记住:不要写错键值key,不然会找不到对应)
3:归档以后就可以写入本地吗? 答案是一定的!
需要写入本地的时候呢?当然需要先有个可写入的路径喽! 有路径以后接可以直接使用[NSKeyedArchiver archiveRootObject:userInfo toFile:RSUserInfoPath];写入这个userInfoModel类.(要是这个类没有创建,没有赋值,岂不是很冤枉).
4:使用呢?怎么拿出来用呢?
AppointmentProjectUserInfoModel *userInfo = [NSKeyedUnarchiver unarchiveObjectWithFile:RSUserInfoPath];呵呵哒,就是这样拿出来喽!直接通过路径去拿出来.
注意啦,这个时候有可能拿到的是nil,,,为什么呢?因为你要是在存进去之前就拿的话,那就是nil了.所以这个时候一般是需要判断一下的,
+ (AppointmentProjectUserInfoModel *)userInfo
{
AppointmentProjectUserInfoModel *userInfo = [NSKeyedUnarchiver unarchiveObjectWithFile:RSUserInfoPath];
return userInfo? userInfo : [[AppointmentProjectUserInfoModel alloc]init];
}
到此,就算是这个功能可以使用了! 就算是文章的完结了吗?不,不是这个样子嘀!!!!!!!!!!!
以上有提到,在实现NSCoding协议的时候每次需要给每个属性进行编码,解码,,,,,属性比较少的情况下还好说,要是很多呢?那不得写死了.反正我是不会这么干的………..谁类谁知道!
那就开始说一下便捷式的吧!
首先:还是先有userInfoModel类了
然后实现NSCoding协议,但是不写实现方法! 为什么呢?因为需要使用的是#import “MJExtension.h”(MJExtension是一个很强大的库,需要了解的话请到百度Google一下)
先导入一下#import “MJExtension.h”,
然后在.m文件中加一句MJCodingImplementation:比如

然后,重复---------3:归档以后写进本地,取出4:使用
是不是很牛叉! 这个方式依然适用于model里面嵌model的方式,不需要继承!
网友评论