ios nsurlcache 离线缓存设置的网络缓存一般什么时候失效

OC 技巧篇(106)
NSURLCache
NSURLCache 为您的应用的 URL 请求提供了内存中以及磁盘上的综合缓存机制。 作为基础类库 URL 加载系统 的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURLCache 处理。
网络缓存减少了需要向服务器发送请求的次数,同时也提升了离线或在低速网络中使用应用的体验。
当一个请求完成下载来自服务器的回应,一个缓存的回应将在本地保存。下一次同一个请求再发起时,本地保存的回应就会马上返回,不需要连接服务器。NSURLCache 会 自动 且 透明 地返回回应。
为了好好利用 NSURLCache,你需要初始化并设置一个共享的 URL 缓存。在 iOS 中这项工作需要在 -application:didFinishLaunchingWithOptions: 完成,而 OS X 中是在 –applicationDidFinishLaunching::
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
diskCapacity:20 * 1024 * 1024
diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
缓存策略由请求(客户端)和回应(服务端)分别指定。理解这些策略以及它们如何相互影响,是为您的应用程序找到最佳行为的关键。
NSURLRequestCachePolicy 缓存策略
NSURLRequest 有个 cachePolicy 属性,它根据以下常量指定了请求的缓存行为:
NSURLRequestUseProtocolCachePolicy: 对特定的 URL 请求使用网络协议中实现的缓存逻辑。这是默认的策略。
NSURLRequestReloadIgnoringLocalCacheData:数据需要从原始地址加载。不使用现有缓存。
NSURLRequestReloadIgnoringLocalAndRemoteCacheData:不仅忽略本地缓存,同时也忽略代理服务器或其他中间介质目前已有的、协议允许的缓存。
NSURLRequestReturnCacheDataElseLoad:无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么从原始地址加载数据。
NSURLRequestReturnCacheDataDontLoad:无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么放弃从原始地址加载数据,请求视为失败(即:“离线”模式)。
NSURLRequestReloadRevalidatingCacheData:从原始地址确认缓存数据的合法性后, 必须得得到服务端确认有效才使用(貌似是NSURLRequestUseProtocolCachePolicy 中的一种情况),缓存数据就可以使用,否则从原始地址加载。
1.URL Loading System默认只支持如下5中协议: 其中只有http://和https://才有缓存策略.
(1) http://
(2) https://
(3) ftp://
(4) file://
(5) data://
2.NSURLRequestReloadIgnoringLocalAndRemoteCacheData 和 NSURLRequestReloadRevalidatingCacheData 根本没有实现!
关于NSURLRequestCachePolicy,以下才是你实际需要了解的东西:
HTTP 缓存语义
因为 NSURLConnection 被设计成支持多种协议——包括 FTP、HTTP、HTTPS——所以 URL 加载系统用一种协议无关的方式指定缓存。为了本文的目的,缓存用术语 HTTP 语义来解释。
HTTP 请求和回应用 headers 来交换元数据,如字符编码、MIME 类型和缓存指令等。
在默认情况下,NSURLRequest 会用当前时间决定是否返回缓存的数据。为了更精确地控制,允许使用以下请求头:
If-Modified-Since - 这个请求头与 Last-Modified 回应头相对应。把这个值设为同一终端最后一次请求时返回的 Last-Modified 字段的值。
If-None-Match - 这个请求头与与 Etag 回应头相对应。使用同一终端最后一次请求的 Etag 值。
NSHTTPURLResponse 包含多个 HTTP 头,当然也包括以下指令来说明回应应当如何缓存:
Cache-Control - 这个头必须由服务器端指定以开启客户端的 HTTP 缓存功能。这个头的值可能包含 max-age(缓存多久),是公共 public 还是私有 private,或者不缓存 no-cache 等信息。详情请参阅 。
除了 Cache-Control 以外,服务器也可能发送一些附加的头用于根据需要有条件地请求:
Last-Modified - 这个头的值表明所请求的资源上次修改的时间。例如,一个客户端请求最近照片的时间线,/photos/timeline,Last-Modified 的值可以是最近一张照片的拍摄时间。
Etag - 这是 “entity tag” 的缩写,它是一个表示所请求资源的内容的标识符。在实践中,Etag 的值可以是类似于资源的 MD5 之类的东西。这对于那些动态生成的、可能没有明显的 Last-Modified 值的资源非常有用。
NSURLConnectionDelegate
一旦收到了服务器的回应,NSURLConnection 的代理就有机会在 -connection:willCacheResponse: 中指定缓存数据。
NSCachedURLResponse 是个包含 NSURLResponse 以及它对应的缓存中的 NSData 的类。
在 -connection:willCacheResponse: 中,cachedResponse 对象会根据 URL 连接返回的结果自动创建。因为 NSCachedURLResponse 没有可变部分,为了改变 cachedResponse 中的值必须构造一个新的对象,把改变过的值传入 –initWithResponse:data:userInfo:storagePolicy:,例如:
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse
NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy];
NSMutableData *mutableData = [[cachedResponse data] mutableCopy];
NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowedInMemoryO
return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response]
data:mutableData
userInfo:mutableUserInfo
storagePolicy:storagePolicy];
如果 -connection:willCacheResponse: 返回 nil,回应将不会缓存。
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse
如果不实现此方法,NSURLConnection 就简单地使用本来要传入 -connection:willCacheResponse: 的那个缓存对象,所以除非你需要改变一些值或者阻止缓存,否则这个代理方法不必实现。
NSURLCache & NSCachedURLResponse常用方法
NSURLCache
1.初始化相关的几个方法:sharedURLCache;setSharedURLCache;initWithMemoryCapacity
sharedURLCache方法返回一个NSURLCache实例。
默认情况下,内存是4M,4* 1024 * 1024;Disk为20M,20 * 1024 * 1024;路径在(NSHomeDirectory)/Library/Caches/(current application name, [[NSProcessInfo processInfo] processName])
setSharedURLCache可以通过这个方法来改变默认的NSURLCache。通过initWithMemoryCapacity来定制自己的NSURLCache。
2.cache使用相关的几个方法:cachedResponseForRequest;storeCachedResponse;removeCachedResponseForRequest;
removeAllCachedResponses
- (NSCachedURLResponse )cachedResponseForRequest:(NSURLRequest )
如果对应的NSURLRequest没有cached的response那么返回nil
- (void)storeCachedResponse:(NSCachedURLResponse )cachedResponse forRequest:(NSURLRequest )
为特定的NSURLRequest做cache
- (void)removeCachedResponseForRequest:(NSURLRequest *)
移除特定NSURLRequest的cache
- (void)removeAllCachedR
移除所有的cache
3.property方法
- (NSUInteger)memoryC
- (NSUInteger)diskC
- (void)setMemoryCapacity:(NSUInteger)memoryC
可能会导致内存中的内存被截断
- (void)setDiskCapacity:(NSUInteger)diskC
- (NSUInteger)currentMemoryU
- (NSUInteger)currentDiskU
a. NSURLCache在每个UIWebView的的NSURLRequest请求中都会被调用。
b. iOS设备上NSURLCache默认只能进行内存缓存。可以通过子类化NSURLCache来实现自定义的版本从而实现在DISK上缓存内容。
c. 需要重写cachedResponseForRequest,这个会在请求发送前会被调用,从中我们可以判定是否针对此NSURLRequest返回本地数据。
d. 如果本地没有缓存就调用下面这条语句:return [super cachedResponseForRequest:request];
NSCachedURLResponse
包装了一下系统缓存机制的对象,保持了缓存对象的个性和特性。
1.NSURLCacheStoragePolicy 缓存策略有三种
NSURLCacheStorageAllowed,
NSURLCacheStorageAllowedInMemoryOnly,
NSURLCacheStorageNotAllowed,
默认是第一种。不过在iOS的上官方文档上有这么一个解释:
Important: iOS ignores this cache policy, and instead treats it asNSURLCacheStorageAllowedInMemoryOnly.
也就是说iOS上只有内存缓存,没有磁盘缓存。
2.构造方法
- (id)initWithResponse:(NSURLResponse )response data:(NSData )
- (id)initWithResponse:(NSURLResponse )response data:(NSData )data userInfo:(NSDictionary *)userInfo storagePolicy:(NSURLCacheStoragePolicy)storageP
3.Open API
- (NSURLResponse *)
- (NSData *)
- (NSDictionary *)userI
- (NSURLCacheStoragePolicy)storageP
正如它那个毫无关系但是名字相近的小伙伴 NSCache 一样,NSURLCache 也是有一些特别的。
Peter Steinberger ,在深入研究内部细节后实现他自己的 。NSURLCache 提醒着我们熟悉我们正在操作的系统是多么地重要。
描述了一些与服务器通信时不设置缓存头的意外的默认行为。
无数开发者尝试自己做一个简陋而脆弱的系统来实现网络缓存的功能,殊不知 NSURLCache 只要两行代码就能搞定且好上100倍。甚至更多开发者根本不知道网络缓存的好处,也从未尝试过,导致他们的应用向服务器作了无数不必要的网络请求。
所以如果你想看到世界的变化,你想确保你有程序总以正确的方式开启,在 -application:didFinishLaunchingWithOptions: 设置一个共享的 NSURLCache 吧。
参考资料:/
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:44081次
积分:2445
积分:2445
排名:第10828名
原创:201篇
转载:38篇
(3)(8)(11)(5)(67)(42)(32)(3)(3)(5)(18)(13)(32)NSURLRequestCachePolicy&缓存策略
NSURLRequestCachePolicy&缓存策略
1& NSURLRequestUseProtocolCachePolicy = 0, 默认的缓存策略,
如果缓存不存在,直接从服务端获取。如果缓存存在,会根据response中的Cache-Control字段判断下一步操作,如:
Cache-Control字段为must-revalidata,
则询问服务端该数据是否有更新,无更新的话直接返回给用户缓存数据,若已更新,则请求服务端.
2& NSURLRequestReloadIgnoringLocalCacheData = 1,
忽略本地缓存数据,直接请求服务端.
3& NSURLRequestIgnoringLocalAndRemoteCacheData = 4,
忽略本地缓存,代理服务器以及其他中介,直接请求源服务端.
4& NSURLRequestReloadIgnoringCacheData =
NSURLRequestReloadIgnoringLocalCacheData
5&&NSURLRequestReturnCacheDataElseLoad
= 2,&有缓存就使用,不管其有效性(即忽略Cache-Control字段),&无则请求服务端.
6& NSURLRequestReturnCacheDataDontLoad =
3,&死活加载本地缓存.&没有就失败.
(确定当前无网络时使用)
NSURLRequestReloadRevalidatingCacheData =
5,&缓存数据必须得得到服务端确认有效才使用(貌似是NSURLRequestUseProtocolCachePolicy中的一种情况)
Tips: URL Loading System默认只支持如下5中协议: 其中只有.
(1) http://
(2) https://
(3) ftp://
(4) file://
(5) data://
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。iOS开发网络篇—数据缓存 - 文顶顶 - 博客园
最怕你一生碌碌无为 还安慰自己平凡可贵
iOS开发网络篇&数据缓存
一、关于同一个URL的多次请求
  有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的。
  上面的情况会造成以下问题
(1)用户流量的浪费
(2)程序响应速度不够快
解决上面的问题,一般考虑对数据进行缓存。
  为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存)
  第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据。
缓存数据的过程
当服务器返回数据时,需要做以下步骤
(1)使用服务器的数据(比如解析、显示)
(2)将服务器的数据缓存到硬盘(沙盒)
此时缓存的情况是:内存缓存中有数据,硬盘缓存中有数据。
再次请求数据分为两种情况:
(1)如果程序并没有被关闭,一直在运行
  那么此时内存缓存中有数据,硬盘缓存中有数据。如果此时再次请求数据,直接使用内存缓存中的数据即可
(2)如果程序重新启动
  那么此时内存缓存已经消失,没有数据,硬盘缓存依旧存在,还有数据。如果此时再次请求数据,需要读取内存中缓存的数据。
提示:从硬盘缓存中读取数据后,内存缓存中又有数据了
三、缓存的实现
由于GET请求一般用来查询数据,POST请求一般是发大量数据给服务器处理(变动性比较大)
因此一般只对GET请求进行缓存,而不对POST请求进行缓存
  在iOS中,可以使用NSURLCache类缓存数据
  iOS 5之前:只支持内存缓存。从iOS 5开始:同时支持内存缓存和硬盘缓存
2.NSURLCache
iOS中得缓存技术用到了NSURLCache类。
缓存原理:一个NSURLRequest对应一个NSCachedURLResponse
缓存技术:把缓存的数据都保存到数据库中。
3.NSURLCache的常见用法
(1)获得全局缓存对象(没必要手动创建)NSURLCache *cache = [NSURLCache sharedURLCache];&
(2)设置内存缓存的最大容量(字节为单位,默认为512KB)- (void)setMemoryCapacity:(NSUInteger)memoryC
(3)设置硬盘缓存的最大容量(字节为单位,默认为10M)- (void)setDiskCapacity:(NSUInteger)diskC
(4)硬盘缓存的位置:沙盒/Library/Caches
(5)取得某个请求的缓存- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)&
(6)清除某个请求的缓存- (void)removeCachedResponseForRequest:(NSURLRequest *)
(7)清除所有的缓存- (void)removeAllCachedR
4.缓存GET请求
  要想对某个GET请求进行数据缓存,非常简单
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  // 设置缓存策略
  request.cachePolicy = NSURLRequestReturnCacheDataElseL
  只要设置了缓存策略,系统会自动利用NSURLCache进行数据缓存
5.iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种)
NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)
NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,没有缓存就重新请求
NSURLRequestReturnCacheDataDontLoad// 有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)
NSURLRequestReloadRevalidatingCacheData // 未实现
6.缓存的注意事项
缓存的设置需要根据具体的情况考虑,如果请求某个URL的返回数据:
  (1)经常更新:不能用缓存!比如股票、彩票数据
  (2)一成不变:果断用缓存
  (3)偶尔更新:可以定期更改缓存策略 或者 清除缓存
提示:如果大量使用缓存,会越积越大,建议定期清除缓存
四、简单的代码示例
1 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
// 1.创建请求
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:8080/YYServer/video"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 2.设置缓存策略(有缓存就用缓存,没有缓存就重新请求)
request.cachePolicy = NSURLRequestReturnCacheDataElseL
// 3.发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (data) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"%@", dict);
// 定期处理缓存
if (缓存没有达到7天) {
request.cachePolicy = NSURLRequestReturnCacheDataElseL
// 获得全局的缓存对象
NSURLCache *cache = [NSURLCache sharedURLCache];
if (缓存达到7天) {
[cache removeCachedResponseForRequest:request];
// lastCacheDate =
NSCachedURLResponse *response = [cache cachedResponseForRequest:request];
if (response) {
NSLog(@"---这个请求已经存在缓存");
NSLog(@"---这个请求没有缓存");
随笔 - 178
评论 - 1393用NSURLCache解决UIWebView请求远程资源慢的问题 - 博客频道 - CSDN.NET
justinjing的专栏
iOS 开发专题
分类:iphone开发学习和总结
& & & & & & 正常情况下当你需要写一个具备网络连接的iOS程序,你会想要一个本地的iOS接口能够接收网络上的所有数据。然而,在项目中总是有一些限制你可以实现的东西,而且有时候你可能想要为用户显示一个规整的页面。
& & & & & & 如果你打算采用这种方式,你最好确信网络接口尽可能流畅。你可以采取的措施之一是将图片的本地复本和其他非更新的资源包含到程序中。
为了在一个远程加载的网页中使用本地资源,或者需要远程页面以某种方式参考本地资源(例如通过URL主题),或者需要用本地地址来代替远程地址。
在这个文章中,我将讲述当网页包含远程资源时如何用本地资源来替代。
& & & & & & & 在Mac上,你可以在WebViewDelegate上使用一系列不同的方式来实现,包括实现webView:resource:willSendRequest:redirectResponse:fromDataSource来使得NSURLRequest代替另一个。不幸的是,iOS中的UIWebViewDelegate并不如此好用因此我们需要以另外的方式来实现。
& & & & & & &幸运的是,还有一点你可以利用:就是NSURLCache在几乎每个请求下都会被调用。正常情况下,只有很少的数据存储在NSURLCache中,特别是在更旧的iOS设备上,这个存储区很小。即使你利用setMemoryCapacity:函数来增加这个缓存的大小,它相对于Mac上的NSURLCache来说还是太小了以至于不能存储资源。
iPhone缓存机制NSURLCache
1. 初始化相关的几个方法:sharedURLCache;setSharedURLCache;initWithMemoryCapacity
sharedURLCache方法返回一个NSURLCache实例。
默认情况下,内存是4M,4* 1024 * 1024;Disk为20M,20 * 1024 * 1024;路径在(NSHomeDirectory)/Library/Caches/(current application name, [[NSProcessInfo processInfo] processName])
setSharedURLCache可以通过这个方法来改变默认的NSURLCache。通过initWithMemoryCapacity来定制自己的NSURLCache。
2. cache使用相关的几个方法:cachedResponseForRequest;storeCachedResponse;removeCachedResponseForRequest;
removeAllCachedResponses
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)
如果对应的NSURLRequest没有cached的response那么返回nil
- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)
为特定的NSURLRequest做cache
- (void)removeCachedResponseForRequest:(NSURLRequest *)
移除特定NSURLRequest的cache
- (void)removeAllCachedR
移除所有的cache
1,内存 or 磁盘
NSURLCache实现了URL访问的缓存。在苹果的帮助文档中,关于NSURLCache是这样写的:
NSURLCache implements the caching of responses to URL load requests by mapping NSURLRequest objects to NSCachedURLResponse objects. It is a composite of an in-memory and an on-disk cache.
虽然它是内存缓存与磁盘缓存的结合。但是在NSCachedURLResponser中关于NSURLCacheStoragePolicy的叙述:
Important iOS ignores this cache policy, and instead treats it as NSURLCacheStorageAllowedInMemoryOnly.
所以说iOS只有内存缓存,没有磁盘缓存。默认情况下,内存是4M(4*)。
2,常用方法
NSURLCache使用的常用方法:
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)
如果对应的NSURLRequest没有cached的response那么返回nil
- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)
为特定的NSURLRequest做cache
- (void)removeCachedResponseForRequest:(NSURLRequest *)
移除特定NSURLRequest的cache
- (void)removeAllCachedR
移除所有的cache
3,其它问题
NSURLCache在每个UIWebView的的NSURLRequest请求中都会被调用。
iOS设备上NSURLCache默认只能进行内存缓存。可以通过子类化NSURLCache来实现自定义的版本从而实现在DISK上缓存内容。
需要重写cachedResponseForRequest,这个会在请求发送前会被调用,从中我们可以判定是否针对此NSURLRequest返回本地数据。
如果本地没有缓存就调用下面这条语句:return [super cachedResponseForRequest:request]
1.NSURLCache只对异步请求有效。
2.ios4.x系统NSURLCache只有内存缓存,ios5.x系统既有内存缓存又有文件缓存,默认缓存文件目录是../[globallyUniqueString]/Library/Caches/[bundle identifier]/Cache.
3.缓存的空间不够时,当前的请求结果不会被缓存。
4.如果有NSURLCache在application接受到内存警告时应该清空缓存,方法如下
& & & & & & & 当然在这个例子中那不是问题,因为我们将会子类化NSURLCache并且实现自定义的版本,该版本将保证可以存储我们所需的资源而且不需要pre-caching(在程序运行之前所有的资源都要保证准备在存储去内)。
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)
& & & & & & &唯一一个我们需要重写的函数是cachedResponseForRequest:,这能够允许我们在它发送前查看每一个请求而且如果我们需要的话返回本地数据。
在这个代码中,我会使用词典来将远程URL映射为在本地程序相关库中的资源的文件名。如果一个请求是指向特定的URL,那么将返回本地文件内容。
下面给出了这个词典。
- (NSDictionary *)substitutionPaths
[NSDictionary dictionaryWithObjectsAndKeys:
@&fakeGlobalNavBG.png&,
@&/global/nav/images/globalnavbg.png&,
只要针对URL:/global/nav/images/globalnavbg.png请求发出,那么下面的cachedResponseForRequest:可以利用资源文件夹中的fakeGlobalNavBG.png文件来代替。
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
// Get the path for the request
NSString *pathString = [[request URL] absoluteString];
// 判断我们是否为这个路径提供了替代资源
NSString *substitutionFileName = [[self substitutionPaths] objectForKey:pathString];
if (!substitutionFileName)
// 没有替代资源,返回默认值
return [super cachedResponseForRequest:request];
// 如果我们已经创建了一个缓存实例,那么返回它
NSCachedURLResponse *cachedResponse = [cachedResponses objectForKey:pathString];
if (cachedResponse)
return cachedR
// 获得替代文件的路径
NSString *substitutionFilePath =
[[NSBundle mainBundle]
pathForResource:[substitutionFileName stringByDeletingPathExtension]
ofType:[substitutionFileName pathExtension]];
NSAssert(substitutionFilePath,
@&File %@ in substitutionPaths didn't exist&, substitutionFileName);
// 加载替代数据
NSData *data = [NSData dataWithContentsOfFile:substitutionFilePath];
// 创建可缓存的响应
NSURLResponse *response =
[[[NSURLResponse alloc]
initWithURL:[request URL]
MIMEType:[self mimeTypeForPath:pathString]
expectedContentLength:[data length]
textEncodingName:nil]
autorelease];
cachedResponse =
[[[NSCachedURLResponse alloc] initWithResponse:response data:data] autorelease];
// 为后续响应,把它加入我们的响应词典中
if (!cachedResponses)
cachedResponses = [[NSMutableDictionary alloc] init];
[cachedResponses setObject:cachedResponse forKey:pathString];
return cachedR
& & & & & 设置我们的缓存区作为共享缓存,一个UIWebView试图使用当前的+[NSURLCache sharedURLCache]。为了调用我的代码,你需要创建一个NSURLCache的子类并且调用+[NSURLCache setSharedURLCache:]。
& & & & & & & & 这里需要注意:一旦你设置新的网络缓存,你可能打算保持它工作直到你的程序退出。
当UIWebView向你的NSURLCache请求资源时,它假设NSURLCache具备NSCachedURLResponse。如果当UIWebView正在使用它的时候你释放了NSCachedURLResponse,有可能你的程序会崩溃。
& & & & & & & & 不幸的是,迫使WebKit释放它的参考(references)—在某些例子里它何时释放是不确定的。只有WebKit去调用removeCachedResponseForRequest:的时候它才通知你可以丢弃那些资源。
这意味着你必须保证程序中只有一个NSURLCache,在application:didFinishLaunchingWithOptions方法中进行设置并且不要移去它。
& & & & &显然地,如果你设置了要用来存储本地数据的缓存区,只有一个查看缓存区的请求才是使其生效。
这意味这如果URL请求是requestWithURL:cachePolicy:timeoutInterval:,缓存策略是NSURLRequestReloadIgnoringCacheData,那么这个请求将忽略本地替代。
& & & & & & & 默认情况下,NSURLRequests的缓存策略是NSURLRequestUseProtocolCachePolicy。这个HTTP的缓存策略是相当复杂的而且我从来没有见过一个正常的NSURLRequest忽视缓存,这些规则可能会在某些情况下产生它忽视缓存的情况。如果这些情况发生的话,你的程序应该保持正常工作。
本地替代缓存示例程序
下面是程序截图:
利用我们的NSURLCache子类调用了后,顶部灰色链接栏上的灰色链接按钮被在本地资源文件中的蓝色图像所代替。
这个工作的意图是允许UIWebView响应更灵敏而且更像本地用户界面。
事实上,UIWebView决不会具有本地用户界面那样的集成度和灵敏的响应。但是
使得本地存储尽可能多的资源有助于尽可能少的带给用户不好的体验。
原文作者:
原文链接:
排名:第696名
(104609)

我要回帖

更多关于 ios 设置缓存失效时间 的文章

 

随机推荐