本文只做本地缓存,只用文件缓存
![](http://file.zhishichong.com/images/article/20161028/6d8723e8c03f33172bf3012b90dffcdd.png)
知识储备
工欲善其事必先利其器,要想封装一个好用的本地缓存库,首先要对本地文件目录有个比较清晰的认识
- 沙盒主路径:是程序运行期间系统会生成一个专属的沙盒路径,应用程序在使用期间非代码的文件都存储在当前的文件夹路径里面
1 2 |
let homePath = NSHomeDirectory() print(homePath) |
把控制台输出的地址拷贝,Finder下前往后可以看到目录结构
![](http://file.zhishichong.com/images/article/20161028/c5bbff4f3c9721dadac62b146f98f801.png)
- Documents:用来存储永久性的数据的文件 程序运行时所需要的必要的文件都存储在这里(数据库)itunes会自动备份这里面的文件
1 2 3 |
//Document 主目录 let documentPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentationDirectory, NSSearchPathDomainMask.AllDomainsMask, true) let path = documentPaths.first |
- Library:用于保存程序运行期间生成的文件
1 2 3 |
//Libaray目录 let libPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.AllDomainsMask, true) let libPath = libPaths.first |
- Caches:文件夹用于保存程序运行期间产生的缓存文件
1 2 3 |
//Cache目录 let cachePaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentationDirectory, NSSearchPathDomainMask.AllDomainsMask, true) let cachePath = cachePaths.first |
- Preferences:主要是保存一些用户偏好设置的信息,一般情况下,我们不直接打开这个文件夹 而是通过
NSUserDefaults
进行偏好设置的存储
NSUserDefaults
的操作非常简单,我对它也小小的封装了一下,写了几个全局方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
func setDefault(key:String,value:AnyObject?){ if value == nil{ NSUserDefaults.standardUserDefaults().removeObjectForKey(key) }else{ NSUserDefaults.standardUserDefaults().setObject(value, forKey: key) NSUserDefaults.standardUserDefaults().synchronize() //同步 } } func removeUserDefault(key:String?){ if key != nil{ NSUserDefaults.standardUserDefaults().removeObjectForKey(key!) NSUserDefaults.standardUserDefaults().synchronize() } } func getDefault(key:String) ->AnyObject?{ return NSUserDefaults.standardUserDefaults().valueForKey(key) } |
- tmp:临时文件夹—程序运行期间产生的临时岁骗会保存在这个文件夹中 通常文件下载完之后或者程序退出的灰自动清空此文件夹itunes不会备份这里的数据。
tips: 由于系统会清空此文件夹所以下载或者其他临时文件若需要持久化请及时移走
本地缓存库
有了这些对文件存储的预备知识,下面来开发我们的本地缓存
首先明确我们为什么要做这件事情,主要是为了提高用户体验
比如:简书中用户浏览了主页,点进了各种详情页看了,然后坐在地铁上,想浏览自己浏览过的页面时,由于连不上网络或者网络很差。这时候如果你把用户浏览的记录都储存在本地,用户体验就会非常舒服。而且用户浏览过的页面,再次浏览的时候直接从本地去,有更新再从服务器取,这样省去了用户的重复等待。
我现在做的app就有这样的需求,每个页面都要做本地存储,因为做了聊天,聊天中的图片和语音也要做本地存储。
针对这个需求,我们来写一个好用的能适配这些情况的库。
因为是缓存,我选择了存在Cache文件夹中。因为需要分类管理,所以我会在Cache地下建几个不同的文件夹,页面缓存的其实是对象类型。用一个文件夹管理,图片和语音也分别用一个,所以这里用了枚举来管理这几种类型。以后添加类型也方便
1 2 3 4 5 6 |
//会在cache下创建目录管理 enum CacheFor:String{ case Object = "zzObject" //页面对象缓存 (缓存的对象) case Image = "zzImage" //图片缓存 (缓存NSData) case Voice = "zzVoice" //语音缓存 (缓存NSData) } |
文件管理,需要用到NSFileManager
对象,这里声明一个文件管理的私有变量。文件的写入放在一个串行的线程中异步执行,需要一个队列对象。 当然还需要一个路径对象。为了避免文件名或者队列名的重复,都声明了一个前缀,还有一个默认的缓存名。最后声明一个私有的缓存类型的变量
知识储备
工欲善其事必先利其器,要想封装一个好用的本地缓存库,首先要对本地文件目录有个比较清晰的认识
- 沙盒主路径:是程序运行期间系统会生成一个专属的沙盒路径,应用程序在使用期间非代码的文件都存储在当前的文件夹路径里面
1 2 |
let homePath = NSHomeDirectory() print(homePath) |
把控制台输出的地址拷贝,Finder下前往后可以看到目录结构
![](http://file.zhishichong.com/images/article/20161028/c5bbff4f3c9721dadac62b146f98f801.png)
- Documents:用来存储永久性的数据的文件 程序运行时所需要的必要的文件都存储在这里(数据库)itunes会自动备份这里面的文件
1 2 3 |
//Document 主目录 let documentPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentationDirectory, NSSearchPathDomainMask.AllDomainsMask, true) let path = documentPaths.first |
- Library:用于保存程序运行期间生成的文件
1 2 3 |
//Libaray目录 let libPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.AllDomainsMask, true) let libPath = libPaths.first |
- Caches:文件夹用于保存程序运行期间产生的缓存文件
1 2 3 |
//Cache目录 let cachePaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentationDirectory, NSSearchPathDomainMask.AllDomainsMask, true) let cachePath = cachePaths.first |
- Preferences:主要是保存一些用户偏好设置的信息,一般情况下,我们不直接打开这个文件夹 而是通过
NSUserDefaults
进行偏好设置的存储
NSUserDefaults
的操作非常简单,我对它也小小的封装了一下,写了几个全局方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
func setDefault(key:String,value:AnyObject?){ if value == nil{ NSUserDefaults.standardUserDefaults().removeObjectForKey(key) }else{ NSUserDefaults.standardUserDefaults().setObject(value, forKey: key) NSUserDefaults.standardUserDefaults().synchronize() //同步 } } func removeUserDefault(key:String?){ if key != nil{ NSUserDefaults.standardUserDefaults().removeObjectForKey(key!) NSUserDefaults.standardUserDefaults().synchronize() } } func getDefault(key:String) ->AnyObject?{ return NSUserDefaults.standardUserDefaults().valueForKey(key) } |
- tmp:临时文件夹—程序运行期间产生的临时岁骗会保存在这个文件夹中 通常文件下载完之后或者程序退出的灰自动清空此文件夹itunes不会备份这里的数据。
tips: 由于系统会清空此文件夹所以下载或者其他临时文件若需要持久化请及时移走
本地缓存库
有了这些对文件存储的预备知识,下面来开发我们的本地缓存
首先明确我们为什么要做这件事情,主要是为了提高用户体验
比如:简书中用户浏览了主页,点进了各种详情页看了,然后坐在地铁上,想浏览自己浏览过的页面时,由于连不上网络或者网络很差。这时候如果你把用户浏览的记录都储存在本地,用户体验就会非常舒服。而且用户浏览过的页面,再次浏览的时候直接从本地去,有更新再从服务器取,这样省去了用户的重复等待。
我现在做的app就有这样的需求,每个页面都要做本地存储,因为做了聊天,聊天中的图片和语音也要做本地存储。
针对这个需求,我们来写一个好用的能适配这些情况的库。
因为是缓存,我选择了存在Cache文件夹中。因为需要分类管理,所以我会在Cache地下建几个不同的文件夹,页面缓存的其实是对象类型。用一个文件夹管理,图片和语音也分别用一个,所以这里用了枚举来管理这几种类型。以后添加类型也方便
1 2 3 4 5 6 |
//会在cache下创建目录管理 enum CacheFor:String{ case Object = "zzObject" //页面对象缓存 (缓存的对象) case Image = "zzImage" //图片缓存 (缓存NSData) case Voice = "zzVoice" //语音缓存 (缓存NSData) } |
文件管理,需要用到