iOS之缓存

缓存可以有效的提高用户体验,在没有网络的情况下,不至于应用没有任何的数据交互。还可以节省用户的流量,在网络良好的情况下,不至于每次都去请求网络数据。

按需缓存,把从服务器获取的内容以某种格式存放在本地文件系统,之后对于每次请求,检查缓存中是否存在这块数据,只有当数据不存在(或者过期)的情况下才从服务器获取。

预缓存可能需要一个后台线程访问数据并以有意义的格式保存,以便本地缓存无需重新连接服务器即可被编辑。

缓存数据在客户端和服务器通信的过程

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(解码),将图片对象放到内存层面做备份,再返回调用层

 

 

 

 

 

 

posted @ 2017-05-31 14:02  风雨彩  阅读(452)  评论(0编辑  收藏  举报