前言
移动端的数据持久化存储方法有很多种:fmdb、coredata、realm(很强大)、archive(归档)等等… 众所周知,sql系列只能存储基本数据类型,不支持直接存储Object对象类型。realm虽然支持存储Object对象,但是对于已经在使用sql系列的项目来说替换成本还是挺高的。
所以我觉得当你使用sql类型来存储数据但是又想存储少量的Object对象,或者App仅仅需要少量的数据存储的时候是完全可以使用归档来满足你的需求的。
所以我封装了WZXArchiver来帮我无脑归、解档。顺便分享我是怎么封装的,如果你有更好的做法或者意见欢迎评论!。
WZXArchiver 已实现功能:
1. 基本数据的自动归、解档。
2. 包含对象的对象的自动归、解档(解档有点不完美)。
3. 清除所有的归档。(这里不讲)
正文
要封装一个自动归档、解档类,首先我们知道归档的基本使用.
归档的基本使用
创建一个NSObject对象: ManModel,它有两个成员变量NSString类型的name、NSInteger类型的age。
1 2 3 4 5 6 |
@interface ManModel : NSObject @property(nonatomic,copy)NSString * name; @property(nonatomic,assign)NSInteger age; @end |
在.m中实现的协议方法(**所有原生的类都是实现了NSCoding协议的,所以你不用在@interface ManModel : NSObject
后面加上**)
1 2 3 4 5 6 7 8 9 10 11 12 |
- (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeInteger:self.age forKey:@"age"]; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super init]) { self.name = [aDecoder decodeObjectForKey:kNameKey]; self.age = [aDecoder decodeIntegerForKey:kAgeKey]; } return self; } |
然后就可以开始归档了:
1 2 3 4 5 |
//归档 [NSKeyedArchiver archiveRootObject:你要归档的对象 toFile:@"地址"]; //解档 [NSKeyedUnarchiver unarchiveObjectWithFile:@"地址"]; |
如何封装一个自动归档、解档类
首先肯定是创建一个NSObject的类别
为什么用类别又不是创建一个工具类?
1. 因为用类别可以少很多参数。
2. 可以重写的协议方法来实现自动归、解档。
添加方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * 通过自定的名字归档 * * @param name 名字 * * @return 是否成功 */ - (BOOL)wzx_archiveToName:(NSString *)na ![Uploading F43FE3F2-826B-4524-B7B6-ABE3CA3D52AD_354525.png . . .]me; /** * 通过之前归档的名字解档 * * @param name 名字 * * @return 解档的对象 */ + (id)wzx_unArchiveToName:(NSString *)name; |
这里一定要传入一个算是标识符的字符串,因为我归档的时候要以它为文件名WZX_类名_标识符.archiver
,解档的时候再根据这个字符串去解档。
获取对象的成员变量
要实现自动xxx,基本上是要用到runtime的,这里也不例外。
不过这里有一点要注意一下:我把获取对象成员变量的方法单独放在一个类别里,提高复用性。
获取对象的成员变量的流程:
1. 创建类别#import "NSObject+WZXProperties.h"
2. 导入头文件 #import
3. 获取成员变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
- (NSArray *)wzx_allProperty { NSMutableArray * propertyArr = [NSMutableArray array]; unsigned int outCount; crayon-t">unsigned int outCount; 类型,不支持直接存储Object对象类型。realm虽然支持存储Object对象,但是对于已经在使用sql系列的项目来说替换成本还是挺高的。
所以我觉得当你使用sql类型来存储数据但是又想存储少量的Object对象,或者App仅仅需要少量的数据存储的时候是完全可以使用归档来满足你的需求的。 所以我封装了WZXArchiver来帮我无脑归、解档。顺便分享我是怎么封装的,如果你有更好的做法或者意见欢迎评论!。 WZXArchiver 已实现功能: 正文要封装一个自动归档、解档类,首先我们知道归档的基本使用. 归档的基本使用创建一个NSObject对象: ManModel,它有两个成员变量NSString类型的name、NSInteger类型的age。
在.m中实现的协议方法(**所有原生的类都是实现了NSCoding协议的,所以你不用在
然后就可以开始归档了:
如何封装一个自动归档、解档类首先肯定是创建一个NSObject的类别为什么用类别又不是创建一个工具类? 添加方法
这里一定要传入一个算是标识符的字符串,因为我归档的时候要以它为文件名 获取对象的成员变量要实现自动xxx,基本上是要用到runtime的,这里也不例外。 获取对象的成员变量的流程:
|