iOS 内存缓存和磁盘缓存

在项目中咱们不免会用到一些缓存方式来保存服务器传过来的数据,以减小服务器的压力。 缓存的方式分为两种分别为内存缓存和磁盘缓存,内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化。常见的内存缓存框架有NSCache、TMMemoryCachePINMemoryCacheYYMemoryCache。常见的磁盘缓框架存有TMDiskCache、PINDiskCache、YYCache.

应用须要离线工做的主要缘由就是改善应用所表现出的性能。将应用内容缓存起来就能够支持离线。咱们能够用两种不一样的缓存来使应用离线工做。第一种是**按需缓存**,这种状况下应用缓存起请求应答,就和Web浏览器的工做原理同样;第二种是**预缓存**,这种状况是缓存所有内容(或者最近n条记录)以便离线访问。
咱们能够理解为按需缓存通常是缓存在内存中的,而预缓存是缓存在磁盘中。

缓存的策略:git

上一节中讨论到按需缓存和预缓存,它们在设计和实现上有很大的不一样。按需缓存是指把从服务器获取的内容以某种格式存放在本地文件系统,以后对于每次请求,检查缓存中是否存在这块数据,只有当数据不存在(或者过时)的状况下才从服务器获取。这样的话,缓存层就和处理器的高速缓存差很少。获取数据的速度比数据自己重要。而预缓存是把内容放在本地以备未来访问。对预缓存来讲,数据丢失或者缓存不命中是不可接受的,比方用户下载了文章准备在地铁上看,但却发现设备上不存在这些文章。github

像Twitter、Facebook这样的应用属于按需缓存,而腾讯视频的视频下载等则属于预缓存。数据库

实现预缓存可能须要一个后台线程访问数据并以有意义的格式保存,以便本地缓存无需从新链接服务器便可被编辑。编辑多是“标记记录为已读”或“加入收藏”,或其余相似的操做。这里**有意义的格式**是指能够用这种方式保存内容,不用和服务器通讯就能够在本地做出上面提到的修改,而且一旦再次连上网就能够把变动发送回服务器。浏览器

按需缓存工做原理相似于浏览器缓存。它容许咱们查看之前查看或者访问过的内容。按需缓存能够经过在打开一个视图控制器时按需地缓存数据模型(建立一个数据模型缓存)来实现,而不是在一个后台线程上作这件事。也能够在一个URL请求返回成功(200 OK)应答时实现按需缓存(建立一个URL缓存)。缓存

选择使用按需缓存仍是预缓存的一个简便方法是判断是否须要在下载数据以后处理数据。后期处理数据多是以用户产生编辑的形式,也多是更新下载的数据,好比重写HTML页面里的图片连接以指向本地缓存图片。若是一个应用须要作上面提到的任何后期处理,就必须实现预缓存。服务器

存储缓存:框架

第三方应用只能把信息保存在应用程序的沙盒中。由于缓存数据不是用户产生的,因此它应该被保存在NSCachesDirectory,而不是NSDocumentsDirectory。为缓存数据建立独立目录是一项不错的实践,一般在Library/caches文件夹下建立子文件夹。MyAppCache的目录。性能

把缓存存储在缓存文件夹下的缘由是iCloud(和iTunes)的备份不包括此目录。若是在Documents目录下建立了大尺寸的缓存文件,它们会在备份的时候被上传到iCloud而且很快就用完有限的空间(写做本书时大约为5 GB)。你不会这么干的——谁不想成为用户iPhone上的良民?NSCachesDirectory正是解决这个问题的。spa

预缓存是用高级数据库(好比原始的SQLite)或者对象序列化框架(好比Core Data)实现的。线程