应用需要离线工作的主要原因就是改善应用所表现出的性能。将应用内容缓存起来就可以支持离线。我们可以用两种不同的缓存来使应用离线工作。第一种是**按需缓存**,这种情况下应用缓存起请求应答,就和Web浏览器的工作原理一样;第二种是**预缓存**,这种情况是缓存全部内容(或者最近n条记录)以便离线访问。
缓存流程:
1.需要获取数据时,检查本地是否有需要获取的数据。
1a. 若存在,则检查本地缓存是否过期。
1aa. 若未过期,则加载本地缓存数据,无需再向服务器请求数据。
2. 本地没有缓存数据,则向服务器请求数据。
缓存分为两种,内存缓存(数据保存在对象中),硬盘缓存。
内存缓存,特点,读取快,缺点,手机内存有限,需要及时清空缓存。
硬盘缓存,特点,空间相对大,但是读取慢,有IO开销。
iOS SDK中为缓存准备了若干种机制,以下几种都偏向于硬盘缓存。
1. 实现数据模型的归档(这个用的比较多)
可以用NSKeyedArchiver类来实现数据模型缓存。
需要实现协议NSCoding .
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;
序列化: 数据模型实现 initWithCoder: 方法,保存到archiver文件中。
反序列化: 从archiver文件读取数据模型,并通过实现encodeWithCoder: 解码数据。
2. Core Data
要在Core Data中保存数据,首先创建一个Core Data模型文件,并创建实体(Entity)和 关系(Relationship)。
应用可以借助Core Data 获取真正的离线访问功能,就像苹果内置的Mail和Calendar应用一样。实现预缓存时,必须定期删除不再需要的过时的数据,否则,缓存会不断增长并影响应用的性能。同步本地变更是通过追踪变更集并发送回服务器实现的。
3. SQLite
将需要缓存的数据,保存到本地数据库中。
在请求时,访问数据库,若数据库有数据,则加载。若没有,则向服务器提出请求,需要获取数据。
读取数据库会产生一定的IO开销。
4. 钥匙串KeyChain
KeyChain是记录iOS 应用中的敏感数据的,比如账号密码等。在卸载应用后并不会随应用一起删除。用Keychain的这个特性来获取唯一性的设备ID,具体做法是,生成一个UUID,或者是获取广告标识符,然后存入Keychain,这样删除应用后再次安装应用也还能读取到上一次生成的设备标识符。
5. UserDefault
内存缓存的步骤:
1. 添加变量来存放内存缓存数据。
2. 限制内存缓存大小,并且把最近最少使用的项写入文件,然后从内存缓存中删除。RAM是有限的,达到使用极限就会触发内存警告。收到警告时不释放内存会使应用崩溃。因此,需要为内存缓存设置一个最大阈值。当缓存满了以后再添加任何东西时,最近最少使用的对象应该被保存到文件。
3. 处理内存警告,并把内存缓存以文件形式写入闪存。
4. 当应用关闭,退出,或进入后台时,将内存缓存全部以文件形式写入闪存。