如何封装一个自动归、解档类

前言

移动端的数据持久化存储方法有很多种:fmdb、coredata、realm(很强大)、archive(归档)等等… 众所周知,sql系列只能存储基本数据类型,不支持直接存储Object对象类型。realm虽然支持存储Object对象,但是对于已经在使用sql系列的项目来说替换成本还是挺高的。

所以我觉得当你使用sql类型来存储数据但是又想存储少量的Object对象,或者App仅仅需要少量的数据存储的时候是完全可以使用归档来满足你的需求的。

所以我封装了WZXArchiver来帮我无脑归、解档。顺便分享我是怎么封装的,如果你有更好的做法或者意见欢迎评论!

WZXArchiver 已实现功能:
1. 基本数据的自动归、解档。
2. 包含对象的对象的自动归、解档(解档有点不完美)。
3. 清除所有的归档。(这里不讲)

正文

要封装一个自动归档、解档类,首先我们知道归档的基本使用.

归档的基本使用

创建一个NSObject对象: ManModel,它有两个成员变量NSString类型的name、NSInteger类型的age。

在.m中实现的协议方法(**所有原生的类都是实现了NSCoding协议的,所以你不用在@interface ManModel : NSObject后面加上**)

然后就可以开始归档了:


如何封装一个自动归档、解档类

首先肯定是创建一个NSObject的类别

为什么用类别又不是创建一个工具类?
1. 因为用类别可以少很多参数。
2. 可以重写的协议方法来实现自动归、解档。

添加方法

这里一定要传入一个算是标识符的字符串,因为我归档的时候要以它为文件名WZX_类名_标识符.archiver,解档的时候再根据这个字符串去解档。

获取对象的成员变量

要实现自动xxx,基本上是要用到runtime的,这里也不例外。
不过这里有一点要注意一下:我把获取对象成员变量的方法单独放在一个类别里,提高复用性

获取对象的成员变量的流程:
1. 创建类别#import "NSObject+WZXProperties.h"
2. 导入头文件 #import
3. 获取成员变量

这里可以看到,我返回的是一个字典数组,每个字典包含name(变量名)和type(变量类型)。变量类型肯定是要根据attributes来判断的:

里面有一个__Model__:,用来判断包含的自定义成员变量,传回"__Model__:自定义成员变量的类名"


自动化归档

重写encodeWithCoder:方法

这里基本就是判断类型来分别编码,就几个点要说一下:
1. 通过[self valueForKey:xxx]可以取出self的成员变量对应的值。
2. 通过是否以__Model__ :开头来判断是不是自定义的对象,若是自定义的对象再通过wzx_archiveToName: andIsSon:来将包含的子对象归档,子对象归档的地址是这样的:WZX_对象类名_对象定义的标识符_子对象类名_子对象名.archiver
仔细想想,这里对象定义的标识符其实我们是得不到的,因为这是在协议的方法里面,无法直接传递name到这个方法中,所以我们要给这个类别添加一个成员变量。

给类别添加成员变量

首先若你希望对象能获取这个成员变量,你可以直接在.h中添加一个成员变量。 否则你需要在.m中添加:

然后重写set、get方法,在类别中添加成员变量还是得用到runtime。

这样我们就成功给类别添加了一个成员变量。

然后我们在wzx_archiveToName:方法时,self.WZX_Archiver_Name = name; 你就会发现还有一个问题,对象包含的子对象归档时也会走这个方法,这样的话 self.WZX_Archiver_Name会被更改,从而导致子对象归档的文件名不对。 所以我们必须要做判断:

子类就走wzx_archiveToName:path andIsSon:YES方法。

这样自动化归档部分就完成了。


自动化解档

重写initWithCoder方法

这里先消除在类别中重写init方法的警告. 然后因为NSObject是基类不能使用super,所以这里没用self = [super initWithCoder:aDecoder],但是我觉得是没有影响的,NSObject类肯定不会使用XIB或者故事版,所以自然不会使用这个方法,那么就不会有什么影响。

解编码

大致和编码一致,根据类型分别编码。 这里有一点没处理好:这里我将对子对象的解档注释了,因为我在解档的方法中对self. WZX_Archiver_Name 赋了值,而在解编码的时候取回来的时候却为nil。所以现在只能通过这个方法来解档:

如果你有更好的处理方法欢迎评论!

现在自动化解档就可以了。


使用效果:

PS.

更多的细节可以看源码

源码地址 如果你喜欢这个项目,欢迎 star

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 5 收藏 评论

关于作者:WzxJiang

本职iOS开发,却想成为一名全栈,在学习过程中分享自己的心得。 个人主页 · 我的文章 · 1 ·    

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部