UIWebView的离线缓存

实际上,UIWebView自己是有缓存的,但容量有限,清理时间我们也不好掌握,那它是用什么做的缓存呢?是NSURLCache。看到它有几个方法:

+ (void)setSharedURLCache:(NSURLCache *)cache;

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request;

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest*)request;

太好了,我们只要写一个子类继承NSURLCache,实现后两个方法,再让这个子类对象成为sharedURLCache,就可以操控webView的请求和缓存了。抛个砖吧:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {

                                                                                                                                                                                                                         

    NSString *pathString = [[request URL] absoluteString];

                                                                                                                                                                                                                         

    if (![pathString hasSuffix:@".jpg"]) {

        return [super cachedResponseForRequest:request];

    }

                                                                                                                                                                                                                         

    if ([[MYURLCache sharedCache] hasDataForURL:pathString]) {

        NSData *data = [[MYURLCache sharedCache] dataForURL:pathString];

        NSURLResponse *response = [[[NSURLResponse alloc] initWithURL:[request URL]

                                                             MIMEType:@"image/jpg"

                                                expectedContentLength:[data length]

                                                     textEncodingName:nil] autorelease];

        return [[[NSCachedURLResponse alloc] initWithResponse:response data:data] autorelease];       

    }

    return [super cachedResponseForRequest:request];

}

                                                                                                                                                                                                                     

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request {

    NSString *pathString = [[request URL] absoluteString];

    if (![pathString hasSuffix:@".jpg"]) {

        [super storeCachedResponse:cachedResponse forRequest:request];

        return;

    }

                                                                                                                                                                                                                         

    [[MYURLCache sharedCache] storeData:cachedResponse.data forURL:pathString];

}

上面的代码是专门用来搞定webView中的jpg图片的,其中MYURLCache提供了把data读、写入文件的功能,这个不是本文的重点,请各位自己实现吧。

在程序启动的时候,加入以下代码:


1

2

MYURLCache *cache = [[MYURLCache alloc] init];

[NSURLCache setSharedURLCache:cache];

OK,搞定了,试试webView加载图片吧~

时间: 2025-01-06 06:07:18

UIWebView的离线缓存的相关文章

使用NSURLProtocol实现UIWebView的离线缓存

http://blog.csdn.net/youcanping2008/article/details/9240487 搜索解决方案的时候找到了Rob Napier 的博文:Drop-in offline caching for UIWebView (and NSURLProtocol) 文章介绍了使用NSURLProtocol实现UIWebView的离线缓存的简单实现,你可以在github上下载这个demo的代码. rob认为无论是"MKNetworkKit"还是"AFCa

使用NSURLProtocol实现UIWebView的离线缓存(转)

搜索解决方案的时候找到了Rob Napier 的博文:Drop-in offline caching for UIWebView (and NSURLProtocol) 文章介绍了使用NSURLProtocol实现UIWebView的离线缓存的简单实现,你可以在github上下载这个demo的代码. rob认为无论是“MKNetworkKit”还是”AFCache”实现的缓存都过于复杂,而他想要的是一个简单机制: 1.你使用了UIWebView指向来显示一个有图像嵌入的网站.2.当你的设备onl

使用NSURLProtocol实现UIWebView的离线缓存的简单实现

文章介绍了使用NSURLProtocol实现UIWebView的离线缓存的简单实现,你可以在github上下载这个demo的代码. 无论是"MKNetworkKit"还是"AFCache"实现的缓存都过于复杂,而他想要的是一个简单机制: 1.你使用了UIWebView指向来显示一个有图像嵌入的网站. 2.当你的设备online时,你有正常的缓存算法. 3.当你的设备offline时,你可以显示页面的最后一个版本. 这个demo里做了一个很简单的测试:将cnn.com

关于离线缓存webView的新方法NSURLProtocol

博文转发自:http://blog.sina.com.cn/s/blog_6291e42d0102v0hf.html 对于目前UIWebView的离线缓存方式主要有如下几种: 1.HTML5 , Manifest最开始我的想法是使用HTML5中的离线存储功能,也就是分析Manifest文件来存储和更新部分资源文件.但是经过实践发现,UIWebView根本不支持HTML5,他只实现了Webkit中页面渲染的那一部分.所以要实现缓存必须要另辟蹊径. 2.NSURLCache  尽管在官方的说明文档里

我是如何一步一步实现网页离线缓存的?

问题 一个Hybrid APP,如何做离线缓存策略?也可以简单来说,你的APP只是一个壳,里面真正加载的内容是H5,如果优化加载内容的速度? 先了解一下NSURLProtocol 从字面意思看它是一个协议,但是它其实是一个类,而且继承自NSObject.它的作用是处理特定URL协议的加载.它本身是一个抽象类,提供了使用特性URL方案处理URL的基础结构.你可以自己创建NSURLProtocol的子类,来让自己的应用支持自定义的协议或者URL方案. 应用程序永远不需要直接实例化一个NSURLPro

HTML5 离线缓存管理库

一.HTML5离线缓存技术 支持离线缓存是HTML5中的一个重点,离线缓存就是让用户即使在断网的情况下依然可以正常的运行应用.传统的本地存储数据的方式有 localstorage,sessionstorage和cookie.但是这些传统的方式有着致命的弊端.首先这些传统的存储方式的最大使用空间有 限,最多不超过5M;其次它们处理大规模的结构化数据的能力有限.鉴于传统方式的局限性,HTML5提出了三种新的离线缓存解决方案:Web SQL,indexedDB和File System. 其中Web S

HTML5 离线缓存详解(转)

离线缓存是html5新特性之一,简单理解就是第一次加载后将数据缓存,在没有清除缓存前提下,下一次没有网络也可以加载,用在静态数据的网页或游戏比较好用.当然,Html5新的特性都不是所有浏览器都能支持的,离线缓存也一样.反正IE9(包括)及IE9以下的浏览器目前是不支持的.如果用在移动端,应该都能支持.检测是否支持离线缓存也是比较简单的. if(window.applicationCache){ alert("支持离线缓存"); } else{ alert("不支持离线缓存&q

iOS离线缓存

为了节省流量和更好的用户体验,目前很多应用都使用本地缓存机制,不需要每次打开app的时候都加载数据,或者重新向服务器请求数据,因此可以把每次浏览的数据保存到沙盒中,当下次打开软件的时候,首先从沙盒加载缓存的数据,或者当app未联网的时候,从沙盒中加载之前缓存的旧数据. 离线数据的方法选择 plist文件 Document路径 数据库 由于保存的是大批量数据,且会不停的刷新新数据,因此应该选择数据库来存储.使用数据库可以快速地进行数据的读取操作. 1.设计思路 如下图,说明了离线缓存的流程: 离线

H5离线缓存机制-manifest

简介:Manifest 其实就是web应用的一种缓存机制,主要用于现在webapp应用中,它是浏览器自己的一种机制,随着移动互联网时代的到来,网络可靠性降低,如果我们已经将需要的文件缓存下下来,一旦网络无法访问,也能继续访问. 而且做好相应资源的缓存可以带来更好的用户体验,当用户使用自己的流量上网时,本地缓存不仅可以提高用户访问速度,而且大大节约用户的使用流量. 先来看下我们公司实际项目中的使用情况.(阿里淘点点也使用了manifest) 第一次加载时:整体请求是392KB耗时1.82s 当本地