代码库> 数据持久化> (重要更新)重新定义NSUserDefault—— ANKeyValue
(重要更新)重新定义NSUserDefault—— ANKeyValue
关注
查看次数:7828 下载次数:409
上传时间:2015-08-04 大小:466 B

GitHub
修复bugs: https://github.com/SpringOx/ANKeyValue

讨论NSUserDefault优化的必要性和实现前,我们可以先回顾下客户端相关的数据存储/持久化。首先笔者想谈得还是数据库,数据库已不是什么先锋技术,但是依然是众多解决方案中开发成本较高的方案,毕竟,在业内的开发实践,也只有数据库会需要独立一类工种——“DB工程师”来支持相关的开发工作。其次是文件,作为Unix like最为重要的技术理念之一,经典、简单而不失强大,文件之于编程,如筷子之于餐桌。iOS上面,我们又开始接触到了更多的解决方案,如著名的CoreData,概念上还是数据库,与常规数据库相比,最大的特点是面向对象,用面向对象的思维去完成数据库的建设和运用,同时支持建表的可视化编辑。然而,相比较于数据库,实现起来也仅能说简化了一点,甚至使用数据库比如SQLite熟悉后,CoreData开发就不见得就比数据库高效,由于高度框架化不免带来性能上的妥协(部分数据场景)。Archive,归档需要先有对象对自身序列化的支持(即把元数据转换为字节流),进而以文件的形式进行存储,归档的优势在于隐去对象整体到数据的转化细节,便于对程序当前状态的保存和恢复。

NSUserDefault,这是iOS中用于存储用户的行为以及程序的状态而使用的基于Key-Value(Object)的存储方式。开发者可以像操作Map/Dictionary之类的容器那样去操作待存储的信息,再由NSUserDefault在恰当的时机进行归档/写入操作,这是一种相当实用且广受欢迎的方式。然而,NSUserDefault并不完美:
第一,NSUserDefault的所有数据是在一张table或者说一个文件上,这使得表现受到很大的限制,我们不太可能用它来存取太大的对象/结构,比如整个对象list,否则会有性能问题;
第二,同1相同的理由,对NSUserDefault我们不能过于频繁地触发文件同步写入的操作,这又为数据的及时更新和同步留下隐患;
第三,NSUserDefault也没有针对大size的数据块专门优化,从NSUserDefault的命名可以看出,就是用于配置项和状态保存使用;
第四,NSUserDefault不支持数据加密和版本升级管理;

原Blog:http://springox.w18.net/?p=292




ANKeyValue尝试保留NSUserDefault的Key-Value接口理念的同时,扩展其适用的范围和层面。ANKeyValue提供类似NSUserDefault的Key-Value接口,高度封装具体的持久化逻辑,我们只需要像对待一块内存一个容器那样去存取我们的对象即可,不仅如此,为了让ANKeyValue真正具备项目应用价值,我们为它实现了以下NSUserDefault难以具备的特性:
1、业务逻辑可分表,这从NSUserDefault得到灵感后第一个希望支持到的特性,我们的业务逻辑完全可以根据自己的需要创建独立的table,而且table与table也是做到存储上隔离的,至少目前是如此;
2、反射自动序列化,对象不必手动编写序列化(当然也可以接受手动编写),业务侧完全不必考虑持久化逻辑,同时也有利于组件自身的迭代优化;
3、异步执行序列化,默认所有的序列化操作均为异步(当然也能支持同步操作),因此,set/get操作的速度仅此于Map/Dicitonary容器,另外,相关的同步保护逻辑都已考虑;
4、数据安全机制,支持存储目标文件名哈希,提供AES级别的加解密Key-Value接口;
5、大数据块优化,设想下,如果写入的对象list包含图片等资源,直接归档将会多么低效,为了减少存取的开销,资源均独立存储,并且限制反复无效读写;
6、版本升级管理,ANKeyValue提供了简单的版本号机制,可用于升级时抛弃式的数据升级;

GitHub地址: https://github.com/SpringOx/ANKeyValue

收藏
我来说两句
发表评论
您还没有登录!请登录注册
所有评论(0
提示
sina weixin mail 回到顶部