背景
- 现有持久层的封装比较简易。有的是直接封装一层,然后业务层面还是需要书写类似NSUserDefaults api的方式来调用。有的封装可能是提供一个model,给这个model添加属性,然后重写这个属性的set、get方法,在set、get方法中写持久层代码
- 有的基础数据的封装只用NSUserDefaults,但是NSUserDefaults建议只是简单快速地保存小型数据,因为NSUserDefaults使用很方便,所以导致很多大型数据也会被塞进来
思考
- 能不能封装MMKV替换掉性能不怎么好的NSUserDefaults
- 有没有很简单的方式让业务层开发时,只添加属性(不重写set、get方法)就可以享受丝滑存取
FeverPreference
基于上面,经过了一系列的整合,产出了个FeverPreference。
FeverPreference的使用很简单 pod 'FeverPreference' 后继承自库内的MFFPreference。然后给你的类添加属性即可。是不是很简单!
FeverPreference的原理
- 在MFFPreference init时读取所有属性对应在MMKV及NSUserDefaults里的值,并通过kvc设置给相应属性
- 在MFFPreference init时给每个属性添加observer
- 当属性值被set时 存储属性值给到MMKV或NSUserDefaults
- MMKV主要存取NSString、NSDictionary、NSArray等有class 方法的数据 NSUserDefaults会存储BOOL、NSInteger等小型数据
- 由于MMKV用法的取值时需要传入对应的class (此处的获取属性class的方法来自Mantle)
- 具体流程如7图
- 现在的问题是用法的迁移,之前的定好的很多key,可能不适合作为property,同时之前数据转MMKV存储也是有一部分小坑的。所以建议大家可以在加新key时使用。
总结
整体用到的知识点有 KVO、KVC、runtime等,其实就是各种直接点的拼接。我已经将实现好的代码发布在了 Github 上,有需要的同学可以自取:FeverPreference。
同时也欢迎大家提出问题