iOS 缓存 NSURLCache类

2024-06-17 04:58
文章标签 ios 缓存 nsurlcache

本文主要是介绍iOS 缓存 NSURLCache类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇文章将只介绍一下将内容缓存到内存中,下一篇文章就介绍一下在iOS磁盘上缓存内容。

使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程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类似。
6NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。

NSURLCache还提供了很多方法,来方便我们实现应用程序的缓存机制。下面我通过一个例子来说明,这个例子减少我们对同一个url多次请求。看下面代码:

[plain]  view plain copy
  1. -(IBAction) buttonPress:(id) sender    
  2.   
  3. {    
  4.   
  5.     NSString *paramURLAsString= @"http://www.baidu.com/";    
  6.   
  7.     if ([paramURLAsString length] == 0){    
  8.   
  9.         NSLog(@"Nil or empty URL is given");    
  10.   
  11.         return;    
  12.   
  13.     }    
  14.   
  15.     NSURLCache *urlCache = [NSURLCache sharedURLCache];    
  16.   
  17.     /* 设置缓存的大小为1M*/   
  18.   
  19.     [urlCache setMemoryCapacity:1*1024*1024];    
  20.   
  21.      //创建一个nsurl    
  22.   
  23.     NSURL *url = [NSURL URLWithString:paramURLAsString];    
  24.   
  25.         //创建一个请求    
  26.   
  27.     NSMutableURLRequest *request =    
  28.   
  29.     [NSMutableURLRequest   
  30.   
  31.      requestWithURL:url    
  32.   
  33.      cachePolicy:NSURLRequestUseProtocolCachePolicy   
  34.   
  35.      timeoutInterval:60.0f];    
  36.   
  37.      //从请求中获取缓存输出    
  38.   
  39.     NSCachedURLResponse *response =    
  40.   
  41.     [urlCache cachedResponseForRequest:request];    
  42.   
  43.     //判断是否有缓存    
  44.   
  45.     if (response != nil){    
  46.   
  47.         NSLog(@"如果有缓存输出,从缓存中获取数据");    
  48.   
  49.         [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];    
  50.   
  51.     }    
  52.   
  53.     self.connection = nil;    
  54.   
  55.     /* 创建NSURLConnection*/   
  56.   
  57.     NSURLConnection *newConnection =    
  58.   
  59.     [[NSURLConnection alloc] initWithRequest:request    
  60.   
  61.                                     delegate:self   
  62.   
  63.                             startImmediately:YES];    
  64.   
  65.     self.connection = newConnection;    
  66.   
  67.     [newConnection release];    
  68.   
  69. }   

这个例子中,我们请求url为www.baidu.com的网站。如果这个url被缓存了,我们直接从缓存中获取数据,否则从www.baidu.com站点上重新获取数据。我们设置了缓存大小为1M。

使用下面代码,我将请求的过程打印出来:

[plain]  view plain copy
  1. - (void)  connection:(NSURLConnection *)connection    
  2.   
  3.   didReceiveResponse:(NSURLResponse *)response{    
  4.   
  5.     NSLog(@"将接收输出");    
  6.   
  7. }    
  8.   
  9. - (NSURLRequest *)connection:(NSURLConnection *)connection    
  10.   
  11.              willSendRequest:(NSURLRequest *)request    
  12.   
  13.             redirectResponse:(NSURLResponse *)redirectResponse{    
  14.   
  15.     NSLog(@"即将发送请求");    
  16.   
  17.     return(request);    
  18.   
  19. }    
  20.   
  21. - (void)connection:(NSURLConnection *)connection    
  22.   
  23.     didReceiveData:(NSData *)data{    
  24.   
  25.     NSLog(@"接受数据");    
  26.   
  27.     NSLog(@"数据长度为 = %lu", (unsigned long)[data length]);    
  28.   
  29. }    
  30.   
  31. - (NSCachedURLResponse *)connection:(NSURLConnection *)connection    
  32.   
  33.                   willCacheResponse:(NSCachedURLResponse *)cachedResponse{    
  34.   
  35.     NSLog(@"将缓存输出");    
  36.   
  37.     return(cachedResponse);    
  38.   
  39. }    
  40.   
  41. - (void)connectionDidFinishLoading:(NSURLConnection *)connection{    
  42.   
  43.     NSLog(@"请求完成");    
  44.   
  45. }    
  46.   
  47. - (void)connection:(NSURLConnection *)connection    
  48.   
  49.   didFailWithError:(NSError *)error{    
  50.   
  51.     NSLog(@"请求失败");    
  52.   
  53. }   

 第一次点击按钮的结果:

2013-05-21 16:26:18.959 CacheDataTest[2838:c07]即将发送请求

2013-05-21 16:26:19.029 CacheDataTest[2838:c07]将接收输出

2013-05-21 16:26:19.029 CacheDataTest[2838:c07]接受数据

2013-05-21 16:26:19.029 CacheDataTest[2838:c07]数据长度为 = 2896

2013-05-21 16:26:19.032 CacheDataTest[2838:c07]接受数据

2013-05-21 16:26:19.032 CacheDataTest[2838:c07]数据长度为 = 4344

2013-05-21 16:26:19.033 CacheDataTest[2838:c07]接受数据

2013-05-21 16:26:19.033 CacheDataTest[2838:c07]数据长度为 = 1448

2013-05-21 16:26:19.036 CacheDataTest[2838:c07]接受数据

2013-05-21 16:26:19.036 CacheDataTest[2838:c07]数据长度为 = 1749

2013-05-21 16:26:19.037 CacheDataTest[2838:c07]将缓存输出

2013-05-21 16:26:19.037 CacheDataTest[2838:c07] ADDRESPONSE - ADDING TO MEMORY ONLY: http://www.baidu.com/

2013-05-21 16:26:19.037 CacheDataTest[2838:c07]请求完成

在看我们第二次点击界面上的按钮,打印结果如下:

2011-07-30 18:52:18.894 Caching[3971:207] 即将发送请求

2011-07-30 18:52:18.895 Caching[3971:207] 将接收输出
2011-07-30 18:52:18.895 Caching[3971:207] 接受数据
2011-07-30 18:52:18.896 Caching[3971:207] 数据长度为 = 7410
2011-07-30 18:52:18.896 Caching[3971:207] 请求完成

我们看到没有“将缓存输出”一项的内容,请求到的数据是第一次请求的累积,也就是第二次是从内存中获取数据的。


Demo代码实例:http://download.csdn.net/detail/u010013695/5422023

转自:http://blog.csdn.net/u010013695/article/details/8956002

这篇关于iOS 缓存 NSURLCache类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068532

相关文章

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

React 记忆缓存的三种方法实现

《React记忆缓存的三种方法实现》本文主要介绍了React记忆缓存的三种方法实现,包含React.memo、useMemo、useCallback,用于避免不必要的组件重渲染和计算,感兴趣的可以... 目录1. React.memo2. useMemo3. useCallback使用场景与注意事项在 Re

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使