缓存可以有效的提高用户体验,在没有网络的情况下,不至于应用没有任何的数据交互。还可以节省用户的流量,在网络良好的情况下,不至于每次都去请求网络数据。
按需缓存,把从服务器获取的内容以某种格式存放在本地文件系统,之后对于每次请求,检查缓存中是否存在这块数据,只有当数据不存在(或者过期)的情况下才从服务器获取。
预缓存可能需要一个后台线程访问数据并以有意义的格式保存,以便本地缓存无需重新连接服务器即可被编辑。
缓存数据在客户端和服务器通信的过程
1. 客户端请求数据,首先检测内存缓存中是否存在数据,如果内存缓存中有没有数据,再判断沙盒里面是否有数据,没有就去服务器里请求数据。
2.客户端第一次拿到数据后,将数据缓存到沙盒中,以便以后使用
3.在次请求数据是,当应用程序没有关闭,内存和沙盒里面都有数据,显示是会用内UC你中的数据
4.当应用程序重新启动,内存中的数据就会被清理掉,显示就会从沙盒里面拿数据。
AFNetWorking:
由于GET请求一般用来查询数据,POST请求一般是发大量数据给服务器处理(变动性比较大)
因此一般只对GET请求进行缓存,而不对POST请求进行缓存.
代码体现:
NSString * cachePath = @"你的缓存路径";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSString * url = @"你的请求地址";
if ([[NSFileManager defaultManager] fileExistsAtPath:cachePath]) {
//从本地读缓存文件
NSData *data = [NSData dataWithContentsOfFile:cachePath];
}else{
[manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { //写缓存 NSString *cachePath = @"你的缓存路径";// /Library/Caches/MyCache [data writeToFile:cachePath atomically:YES]; succsee(data); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }];
}
SDWebImage库的缓存
这个库具有缓存管理,异步下载,同一个URL下载次数控制和优化等特征。
1.UIImageView+WebCacha 加载网络图片的入口,setImageWithURL:placeholderImage:options:
会先把placeholderImage显示在控件上,然后由SDWebImageManager根据URL开始处理图片。
2.SDWebImageManager,对图片进行管理的中转站,向下层读取Cache(调用SDImageCache),或者向网络读取对象(调用SDWebImageDownloader)
3.SDImageCache可以对图片进行存储和读取,实现图片和内存清理工作。
4.SDWebImageDownloader根据URL向网络读取数据。
5.SDWebImageDecoder,对图像进行了一次解压,由于UIImage加载图片的时候才将Data解压成ARGB的图像。每次加载时都会有这个解压操作,这样做效率是十分低下的。而SDWebImageDecoder将包装在Data下的数据解压,画在一张新的图片上,方便以后加载图片是使用。
SDImageCache分两个部分,一个是内存层面的,一个是硬盘层面的。内存层面的相当是个缓存器,当内存不够的时候会清除所有缓存图片。先搜索内存层面的数据,没有的话去访问磁盘,将图片从磁盘读取出来,然后做Decoder(解码),将图片对象放到内存层面做备份,再返回调用层