iOS应用架构谈本地持久化方案及动态部署

架构师(JiaGouX)我们都是架构师!前言

嗯,你们要的大招。

持久化方案不管是服务端还是客户端,都是一个非常值得讨论的话题。尤其是在服务端,持久化方案的优劣往往都会在一定程度上影响到产品的性能。然而在客户端,只有为数不多的业务需求会涉及持久化方案,而且在大多数情况下,持久化方案对性能的要求并不是特别苛刻。所以我在移动端这边做持久化方案设计的时候,考虑更多的是方案的可维护和可拓展,然后在此基础上才是性能调优。这篇文章中,性能调优不会单独开一节来讲,而会穿插在各个小节中,大家有心的话可以重点看一下。

持久化方案对整个App架构的影响和网络层方案对整个架构的影响类似,一般都是导致整个项目耦合度高的罪魁祸首。而我也是一如既往的去Modl化的实践者,在持久层去Modl化的过程中,我引入了VirtualRcord的设计,这个在文中也会详细描述。

这篇文章主要讲以下几点:

根据需求决定持久化方案

持久层与业务层之间的隔离

持久层与业务层的交互方式

数据迁移方案

数据同步方案

另外,针对数据库存储这一块,我写了一个CTPrsistanc,这个库目前能够完成大部分的持久层需求,同时也是我的VirtualRcord这种设计思路的一个样例。这个库可以直接被cocoapods引入,希望大家使用的时候,能够多给我提issu。这里是CTPrsistancClassRfrnc。

根据需求决定持久化方案

在有需要持久化需求的时候,我们有非常多的方案可供选择:NSUsrDfault、KyChain、Fil,以及基于数据库的无数子方案。因此,当有需要持久化的需求的时候,我们首先考虑的是应该采用什么手段去进行持久化。

NSUsrDfault

一般来说,小规模数据,弱业务相关数据,都可以放到NSUsrDfault里面,内容比较多的数据,强业务相关的数据就不太适合NSUsrDfault了。另外我想吐槽的是,天猫这个App其实是没有一个经过设计的数据持久层的。然后天猫里面的持久化方案就很混乱,我就见到过有些业务线会把大部分业务数据都塞到NSUsrDfault里面去,当时看代码的时候我特么就直接跪了。。。问起来为什么这么做?结果说因为写起来方便~你妹。。。

kychain

Kychain是苹果提供的带有可逆加密的存储机制,普遍用在各种存密码的需求上。另外,由于App卸载只要系统不重装,Kychain中的数据依旧能够得到保留,以及可被iCloud同步的特性,大家都会在这里存储用户唯一标识串。所以有需要加密、需要存iCloud的敏感小数据,一般都会放在Kychain。

文件存储

文件存储包括了Plist、archiv、Stram等方式,一般结构化的数据或者需要方便查询的数据,都会以Plist的方式去持久化。Archiv方式适合存储平时不太经常使用但很大量的数据,或者读取之后希望直接对象化的数据,因为Archiv会将对象及其对象关系序列化,以至于读取数据的时候需要Dcod很花时间,Dcod的过程可以是解压,也可以是对象化,这个可以根据具体中的实现来决定。Stram就是一般的文件存储了,一般用来存存图片啊啥的,适用于比较经常使用,然而数据量又不算非常大的那种。

数据库存储

数据库存储的话,花样就比较多了。苹果自带了一个CorData,当然业界也有无数替代方案可选,不过真正用在iOS领域的除了CorData外,就是FMDB比较多了。数据库方案主要是为了便于增删改查,当数据有状态和类别的时候最好还是采用数据库方案比较好,而且尤其是当这些状态和类别都是强业务相关的时候,就更加要采用数据库方案了。因为你不可能通过文件系统遍历文件去甄别你需要获取的属于某个状态或类别的数据,这么做成本就太大了。当然,特别大量的数据也不适合直接存储数据库,比如图片或者文章这样的数据,一般来说,都是数据库存一个文件名,然后这个文件名指向的是某个图片或者文章的文件。如果真的要做全文索引这种需求,建议最好还是挂个API丢到服务端去做。

总的说一下

NSUsrDfault、Kychain、Fil这些持久化方案都非常简单基础,分清楚什么时候用什么就可以了,不要像天猫那样乱写就好。而且在这之上并不会有更复杂的衍生需求,如果真的要针对它们写文章,无非就是写怎么储存怎么读取,这个大家随便Googl一下就有了,我就不浪费笔墨了。由于大多数衍生复杂需求都是通过采用基于数据库的持久化方案去满足,所以这篇文章的重点就数据库相关的架构方案设计和实现。如果文章中有哪些问题我没有写到的,大家可以在评论区提问,我会一一解答或者直接把遗漏的内容补充在文章中。

持久层实现时要注意的隔离

在设计持久层架构的时候,我们要







































北京民间偏方治疗白癜风
儿童白癜风能治疗好吗



转载请注明:http://www.jiaju1314.com/jbjj/9948.html