利用 KVO 简单封装MMKV+NSUserDefaults

2,095 阅读2分钟
iOS数据持久化方案有很多,本文主要选择NSUserDefaults,以及MMKV 来实现基础数据的高效、方便的存取。当然高效是靠MMKV,我的封装目的是用起来方便。

背景

  1. 现有持久层的封装比较简易。有的是直接封装一层,然后业务层面还是需要书写类似NSUserDefaults api的方式来调用。有的封装可能是提供一个model,给这个model添加属性,然后重写这个属性的set、get方法,在set、get方法中写持久层代码
  2. 有的基础数据的封装只用NSUserDefaults,但是NSUserDefaults建议只是简单快速地保存小型数据,因为NSUserDefaults使用很方便,所以导致很多大型数据也会被塞进来

思考

  1. 能不能封装MMKV替换掉性能不怎么好的NSUserDefaults
  2. 有没有很简单的方式让业务层开发时,只添加属性(不重写set、get方法)就可以享受丝滑存取

FeverPreference

基于上面,经过了一系列的整合,产出了个FeverPreference。
FeverPreference的使用很简单 pod 'FeverPreference' 后继承自库内的MFFPreference。然后给你的类添加属性即可。是不是很简单!

FeverPreference的原理

  1. 在MFFPreference init时读取所有属性对应在MMKV及NSUserDefaults里的值,并通过kvc设置给相应属性
  2. 在MFFPreference init时给每个属性添加observer
  3. 当属性值被set时 存储属性值给到MMKV或NSUserDefaults
  4. MMKV主要存取NSString、NSDictionary、NSArray等有class 方法的数据 NSUserDefaults会存储BOOL、NSInteger等小型数据
  5. 由于MMKV用法的取值时需要传入对应的class (此处的获取属性class的方法来自Mantle)
  6. 具体流程如7图
  7. 现在的问题是用法的迁移,之前的定好的很多key,可能不适合作为property,同时之前数据转MMKV存储也是有一部分小坑的。所以建议大家可以在加新key时使用。


总结

整体用到的知识点有 KVO、KVC、runtime等,其实就是各种直接点的拼接。我已经将实现好的代码发布在了 Github 上,有需要的同学可以自取:FeverPreference。


同时也欢迎大家提出问题