iOS系统数据持久化综述

1目标
了解移动端的数据持久化存储方式和对应的使用场景,提供相关技术选型做技术储备。
2数据持久化的目的
在应用程序开发中,数据层一直是程序的核心结构之一。数据的持久化是指将从数据库取出的数据进行封装,放在一个对象里,目的是为了以后的使用更加高效,不必每次都从数据库里取数据。下面将介绍为何要数据持久化。
2.1快速展示,提升体验
对已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户,这时对数据进行持久化存储,可以实现应用的离线功能,以此提高用户体验。
2.2节省用户流量(节省服务器资源)和离线使用
对于较大的资源数据进行缓存,下次展示无需下载消耗流量,同时降低了服务器的访问次数,节约服务器资源。、另外用户浏览过的数据无需联网,可以再次查看。部分功能使用解除对网络的依赖。(如地图和阅读类应用),在无网络时,允许用户进行操作,等到下次联网时同步到服务端。
2.3记录用户操作
提供编辑草稿,对于用户需要花费较大成本进行的操作,对用户的每个步骤进行缓存,用户中断操作后,下次用户操作时直接继续上次的操作。还有已读内容标记缓存,帮助用户识别哪些已读。提供搜索记录缓存,搜索历史功能。
3数据持久化方式分类
在移动端的数据持久化方式总体可以分为以下两类:内存缓存和磁盘缓存。在内存缓存中,内存是指当前程序的运行空间,缓存速度快容量小,是临时存储文件用的,供CPU直接读取,当打开一个程序,其实是在内存中存储,关闭程序后内存就又回到原来的空闲空间;而磁盘是程序的存储空间,缓存容量大速度慢可持久化与内存不同的是磁盘是永久存储东西的,不管进程是否运行,都会占用磁盘空间。
3.1内存缓存
下颌角肥大矫正术计算机为了提升访问数据的速度,实现了CPU的多级缓存机制,CPU计算时经常要用到的数据会被从其他地方读到内存里,对于使用频率比较高的数据,从网络或者磁盘加载数据到内存以后,使用后并不马上销毁,下次使用时直接从内存加载。
(1)对iOS系统来说,最经典的内存加载形式莫过于图片加载[UIImage imageNamed:@"imageName"],当UIImage对象显示到屏幕上时,会在应用的bundle中寻图片,如果到,则Cache到系统内存缓存中,同时解码结果也会保存到全局缓存去。在图片解码完成后,应用回到后台或者收到系统内存警告时,该图片的缓存才会被清空,其他情况下缓存会一直存在。当程序Kill 或退出时,缓存也将随之清除。
(2)网络图片加载三方库SDWebImage,当使用SDWebImage获取网络图片时,SDWebImage并不是直接发起网络请求,而是先从缓存中查图片是否已经下载,首先检查内存缓存,如果内存中有,直接返回im⁃作者简介:姚进峰(1990-),男,工程师,研究方向: iOS前端技术。
iOS系统数据持久化综述
姚进峰
(深圳市南山区丽水路大学城,广东深圳518000)
郧阳师专中文系摘要:所谓持久化,即把数据存储到可永久保存的存储设备中。持久化的主要应用是将内存中的数
据存储在关系型的数据库中。持久化技术目前被广泛应用于各种程序设计的领域中。在要探讨的iOS
中的数据持久化技术中,iOS系统中主要提供了几种方式用于简单地实现数据持久化功能:内存存储以
及磁盘存储、数据库存储等。对于以持久化的意义有很多,比如能共享业务数据、节约内存容量、数
据备份、方便大规模数据检索。综合讲述并比较了一些有代表性的iOS系统持久化方法。
关键词:持久化;存储
79
2021.2
2021.2
age,如果没有,再从磁盘中查是否有图片缓存,如果磁盘读取到了图片,会将图片添加到内存中然后返回(如果内存空间不足,会先清理内存缓存),如果内存和磁盘均没有图片缓存,则进行图片下
载,下载完成后刷新UI 并将图片进行内存缓存和磁盘缓存(如果内存空间不足,会先清理内存缓存)。3.2磁盘缓存
磁盘缓存将从网络加载的、用户操作产生的数据写
入到磁盘,用户下次查看、继续操作时,直接从磁盘加载使用。磁盘缓存的一个重要特征是不受进程生命周期影响。
用户输入内容草稿缓存,如UItextView 和UITextFi-eld,一般将其缓存在磁盘中,即使程序退出,下次用户进入还能查看草稿。搜索历史缓存同理。
4
cao20
iOS 端的数据持久化方案
4.1内存缓存
实现内存缓存的技术手段包括苹果官方提供的
NSURLCache,NSCache,还有性能和API 上比较有优势的开源缓存库YYCache、PINCache 等。4.2磁盘缓存4.2.1NSUserDefault
NSUserDefaults 是一个单例,在整个程序中只有一
个实例对象,而且不同于我们自己定义的单例,因为他不会随着这个程序的关闭而清除掉保存的数据,所以下次开启程序,之前保存的数据还会存在,所以它用于本地数据的持久化,而且简单实用。一般适合小规模数据,弱业务相关数据的缓存。4.2.2Keychain
Keychain 是苹果提供的带有可逆加密的存储机制,
普遍用在各种存用户名、密码的需求上。另外,Key⁃
chain 是系统级存储,还可以被iCloud 同步,即使App 被删除,Keychain 数据依然保留,用户下次安装App,可以直接读取,通常会用来存储用户唯一标识串。所以需要加密、同步iCloud 的敏感小数据,一般使用Key⁃chain 存取。4.2.3文件存储
Plist:全名PropertyList,即属性列表文件,通常用
于储存用户设置,也可以用于存储捆绑的信息。它是一种用来存储串行化后的对象的文件。这种文件存储形式常用于iOS 开发过程中。该类属性列表文件的扩展名
为.plist,因此通常被叫做Plist 文件。文件结构是xml 格式的。但由于Plist 中存储的数据是抽象的,所
以其采用的文件格式可以不止一种。另Plist 文件是以key-val⁃ue 的形式来存储数据。既可以用来存储用户设置,也可以用来存储一些常用而不常改动的信息(如程序配置等)。一般结构化的数据可以用Plist 的方式持久化存储。
Archive:Archive 方式可以存取遵循协议的数据,
比较方便的是存取使用的都是对象,由于使用对象存储,存储和读取过程过程中间需要序列化和反序列化需要花费一定的性能,可以在想要使用对象直接进行磁盘存取时使用。4.2.4数据库存储
数据库按照数据结构来组织、存储和管理数据的仓库。适合存取一些关系型的数据,可以在有大量的条件查询排序类需求时使用。
CoreData:CoreDate 是苹果在iOS3.0后引入的数据
持久化解决方案,它被官方推荐使用,不再需要借助第三方框架。但由于使用形式过于复杂,目前在iOS 持久化领域使用情况并不多。CoreDate 实际上是对数据库SQLite 的封装,提供了一些更高级的调用方式。在对数据库操作时,不再需要学习使用SQL 语句。但它不支持跨平台使用,如果想实现跨平台,就需要使用SQLite
来进行数据持久化。
多边主义FMDB:FMDB 是iOS 平台下封装的SQLite 数据库框架,提供以OC 的方式的语言API。它使用简单,由于使用面向对象方式,开发者不需要了解底层C 语言代码,对比iOS 自带的CoreData 框架,FMDB 的特点是轻量级、灵活、线程安全,另外FMDB 可以防止数据混乱。它目前也是Github 最受欢迎的iOS 封装开源库之一。4.3选取缓存方案
在实际开发中,可以根据需求选择:
(1)简单数据存储直接写文件、用Key-value 存取即可。
(2)需要按照一些条件查、排序等需求的,可以使用SQLite 等关系型存储方式。
产翁制(3)敏感性高的数据,推荐加密存储。(4)不希望App 卸载后清除的小容量数据(用户名、密码、token)存Keychain。
目前提供这些缓存方案,开发者可以根据产品自身
80
的需求定制灵活的方案,每个持久化方案的侧重点、支持的形式和方式也不尽相同,在不同的使用场景下表现也是各有优劣。
5数据库缓存
5.1概述
存储数据量较大的数据,一般使用数据库来存储。如:FMDB、CoreData、Realm、WCDB。
5.2对比
SQLite数据库的使用包括增、删、改、查等基本操作,同时在项目中运用,还需要数据转模型、数据库通过增删表、字段和数据迁移完成版本升级等操作,下文通过对这些操作在各个流行库中的使用示例来对比各个库的易用性。
5.2.1FMDB
FMDB是对SQLite的面向OC的封装,把C语言对SQL的操作封装成OC风格代码。主要有以下特点:OC 风格省去了大量重复、冗余的C语言代码;提供了多线程安全的数据库操作方法,保证数据的一致性;相比CoreData、Realm等更加轻量。
5.2.2WCDB
WCDB是技术团队内部在APP SQLite使用实践抽取的一套开源封装,主要具有以下特点:通过宏定义的方式实现了ORM映射关系,根据映射关系完成建表、数据库新增字段、修改字段名(绑定别名)、数据初始化绑定等操作;自研了WINQ的语法,大部分场景不需要直接写原生SQLite语句,易用性高;内部实现了安全的多线程读写操作(写操作还是串行)和数据库初始化优化,提升了性能。WCDB也提供了其它较多场景的解决方案:错误统计、性能统计、损坏修复等。
5.2.3Realm
Realm团队自建搜索引擎实现的一套ORM数据库操作模式,它是MVCC数据库,主要具有以下特点:采用了零拷贝架构、自动更新对象和查询、真实的懒加载(使用时才从磁盘加载真实数据)、跨平台,支持iOS、Android。
6iOS系统持久化在项目中的应用
6.1图片缓存
以SDWebImage为代表的图片缓存库基本都实现了二级缓存、队列下载、异步解压、Category拓展等能力,常用的图片加载展示需求都可以使用它们来完成。大家投
6.2简单key-value存取
系统的如NSCache、NSKeyedArchive等缓存功能能满足基本的存取需求。PINCache和YYCache等这些三方库拓展了相当多的能力来满足大部分的使用场景,并且内部通过LRU等策略来提升效率,同时内部实现了二级缓存来加快加载速度,可以考率直接使用。6.3数据库
(1)Core Data由于入门门槛高、坑多等原因导致口碑并不太好,这里就不推荐尝试了。
(2)FMDB可以说经过了大量iOS App的验证,它虽然在一些扩展能力上并不尽人意,但是其稳定性久经考验,基于SQLite实现,不改变表结构数据的情况下,便于直接迁移到如WCDB等实现。
(3)WCDB和Realm都是基本不需要写SQL语句就能完成增删改查,都跨平台,扩展了如加密、数据升级等很多便捷的封装,用起来都比FMDB更爽。除此之外,团队本身就在使用WCDB,他们在数亿用户量的情况下遇到的性能、数据损坏等问题更多,他们做的优化也就更多,而这些优化,使用WCDB就可以体验到。
7结语
(1)封装:无论使用哪个三方库进行缓存实现,最好做一层封装,这样便于在想要切换别的实现时,直接内部做好数据迁移,对于使用方完全无感知迁移,或者仅需要其做极少的工作,而不是全量的替换。(2)区分用户目录存储:每个用户都使用单独的文件夹来存储他的数据,对数据库也一样,这样做
的好处在于,用户数据不会相互污染(比如数据库中存在复杂的多表关联关系时,会使SQL语句变得很复杂,提升了区分用户出错的概率),也便于进行数据诊断。(3)单例:建议对于某个时间段的数据操作都交给一个对象去做,内部来保证多线程读写安全,降低出错的概率。
(4)用户切换的处理:由于区分用户存储目录,切换登录用户时,需要我们切换数据存取的实例,此时,不要马上销毁上个实例,上个实例可能还有未完成的读写任务,等待完成或中断其操作后再销毁
81
2021.2

本文发布于:2024-09-22 17:33:53,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/100055.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   缓存   使用   用户   内存   磁盘   操作
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议