• iOS的内存缓存机制

    发布:51Code 时间: 2016-11-07 16:15

  • 在iOS应用开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制。缓存有两种方式,一种是缓存在内存上,一种是缓存在本地磁盘上。...

  • 在iOS应用开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制。缓存有两种方式,一种是缓存在内存上,一种是缓存在本地磁盘上。
     
    缓存有不同的分类方法:

    这里我们主要按照功能进行划分:

     首先要知道,POST请求不能被缓存,只有 GET 请求能被缓存。使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求。本篇文章将带领大家学习如何将网络数据缓存到内存上。

       内存缓存我们可以使用SDK中的NSURLCache类。NSURLRequest需要一个缓存参数来说明它请求的url何如缓存数据的,我们先看下它的CachePolicy类型。

    1、NSURLRequestUseProtocolCachePolicy NSURLRequest默认的cache policy,使用Protocol协议定义。
    2、NSURLRequestReloadIgnoringCacheData 忽略缓存直接从原始地址下载。
    3、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data时才从原始地址下载。
    4、NSURLRequestReturnCacheDataDontLoad 只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式;
    5、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。
    6、NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。
    NSURLCache还提供了很多方法,来方便我们实现应用程序的缓存机制。

    设置缓存的步骤:

    第一步:使用GET请求
    第二步:设置下内存缓存大小、磁盘缓存大小、以及缓存路径

       下面我们通过请求url为www.baidu.com的网站。如果这个url被缓存了,我们直接从缓存中获取数据,否则从www.baidu.com站点上重新获取数据。我们设置了缓存大小为4M。代码如下:
     

      1 |  #import "ViewController.h"
      2 |  @interface ViewController ()<NSURLConnectionDelegate>
      3 |  @property(nonatomic,strong)NSURLConnection *connection;
      4 |  @end
      5 |  @implementation ViewController
      6 |  - (void)viewDidLoad {
      7 |      [super viewDidLoad];
      8 |  }
      9 |  - (IBAction)request:(id)sender {
     10 |      NSString *paramURLAsString = @"http://www.baidu.com/";
     11 |      if ([paramURLAsString length] == 0){
     12 |          NSLog(@"nil  or empty URL is given");
     13 |          return;
     14 |      }
     15 |      //设置缓存的大小
     16 |      NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
     17 |      NSURL *url = [NSURL URLWithString:paramURLAsString];
     18 |      //创建一个请求
     19 |      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy
     20 |      //从请求中获取缓存输出
     21 |      NSCachedURLResponse *response = [urlCache cachedResponseForRequest:request];
     22 |      //判断是否有缓存
     23 |      if (response!= nil){
     24 |          NSLog(@"如果有缓存输出,从缓存中读取");
     25 |          //使用缓存,绝对不请求网络
     26 |          [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];
     27 |      }
     28 |      self.connection = nil;
     29 |      //重新创建NSURLConnection链接
     30 |      NSURLConnection *newConnection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
     31 |      self.connection = newConnection;
     32 |  }

    这样我们就实现了将网络请求的数据缓存到内存中。

  • 上一篇:iOS的单例设计模式,你真的了解吗?

    下一篇:iOS界面传值—属性和通知传值

网站导航
Copyright(C)51Code软件开发网 2003-2018 , 沪ICP备05003035号