//联系人:石虎 QQ: 1224614774昵称:嗡嘛呢叭咪哄
1. 基本概念
缓存: 缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。
2. 手机缓存的分类
第1种是按需缓存,这种情况下应用缓存起请求应答,就和Web浏览器的工作原理一样;按需缓存技术来改善可感知的性能。以微信为例,打开朋友圈时。应用会获取加载网络请求并填充页面。加载时间线时会看到一个表示正在加载的activityIndicator在旋转。现在进入另一个页面,然后再返回。你会发现这次是瞬间加载的,并且不会显示activityIndicator。如果没有缓存,用户每次打开一个页面都会看到圆圈在旋转。无论网络连接快还是慢,减小网络加载慢的影响,让它看起来很快,是iOS开发者的责任。
第2种是预缓存,这种情况是缓存全部内容(或者最近n条记录)以便离线访问。预缓存更加重视被缓存数据,并且能快速编辑被缓存的记录而无需连接到服务器。如网易新闻,可以先下载下来,在上下班的时候阅读。
3. 缓存原理
1. 按需缓存是指把从服务器获取的内容以某种格式存放在本地文件系统,之后对于每次请求,检查缓存中是否存在这块数据,只有当数据不存在(或者过期)的情况下才从服务器获取。按需缓存可以通过在打开一个视图控制器时按需地缓存数据模型(创建一个数据模型缓存)来实现,也可以在一个URL请求返回成功应答时实现按需缓存(创建一个URL缓存)。
2. 预缓存是把内容放在本地以备将来访问。实现预缓存可能需要一个后台线程访问数据并以有意义的格式保存。
4. 选择使用按需缓存还是预缓存的判断标准
一个简便方法是判断是否需要在下载数据之后处理数据。如果需要对数据进行后期处理,就必须实现预缓存。
5. 存储缓存
缓存数据应该保存在应用程序的沙盒Library/caches文件夹下。我们在Library/caches文件加下建立一个myCache文件夹,以后我们就会将缓存下来的数据存储在这个文件夹下了。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES);
NSString *cachesDirectory = [paths firstObject];
cachesDirectory = [cachesDirectory stringByAppendingPathComponent:@"MyCache"];
将数据进行缓存有三种。
第一种数据模型缓存。即序列化和反序列化(又叫归档和反归档)
第二种使用Core Data 保存数据。
第三种使用SQlite进行保存
第四种URL缓存
按需缓存可以用数据模型缓存或URL缓存来实现。当服务器设计得体,遵循HTTP 1.1的缓存规范时,URL缓存效果最好。如果服务器是SOAP服务器(或者实现类似于RPC服务器或RESTful服务器),就需要用数据模型缓存。
7. 按需缓存控制流程图
以第一种为例 进行预缓存
即在viewWillAppear方法中,查看缓存中是否有显示这个视图所需的数据。如果有就获取数据,然后检查缓存中的数据是否已经过期。如果数据没有过期,则把数据显示在UI上,如果数据已经过期,则从服务器获取数据并更新UI。如果缓存中没有数据,则从服务器获取数据并更新UI,在ViewWillDisappear方法中保存缓存。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSMutableArray *cachedItems = [NSKeyedUnarchiver unarchiveObjectWithFile:ARCHIVEPATH];
self.menuItems = cachedItems == nil ? [AppDelegate.engine localMenuItems] ? : cachedItems;
NSDate *modefyDate = [[[NSFileManager defaultManager]attributesOfItemAtPath:[self filePathWithFileName:@"test"] error:nil]fileModificationDate];
NSTimeInterval stalenessLevel = [[NSDate date]timeIntervalSinceDate:modefyDate];
if(stalenessLevel > THRESHOLD)
self.menuItems = [AppDelegate.engine localMenuItems];
[self updateUI];
}
视图控制器的viewWillDisappear:方法中缓存数据模型的代码片段- (void)viewWillDisappear{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
[super viewWillDisappear];
NSUserDomainMask, YES);
NSString *cachesDirectory = [paths objectAtIndex:0];
NSString *archivePath = [cachesDirectory stringByAppendingPathComponent:@" AppCache/MenuItems.archive"];
[NSKeyedArchiver archiveRootObject:self.menuItems toFile:archivePath];
}