什么时候UIWebView中的缓存开始工作?

时间:2011-07-25 17:39:07

标签: iphone caching uiwebview nsurlrequest

我一直在测试一个iPhone视图控制器,它使用UIWebView加载外部内容,而不是项目包中的资源。另一位工程师注意到Web视图根本没有缓存,所以我进行了一些研究。一些较旧的问题表明UIWebView无法缓存外部内容。

以前关于UIWebView缓存的SO问题:

那些帖子非常混乱,但我注意到在iOS 4.0问世之前他们都被问到了。我测试了以下缓存方法,这看起来很简单。

NSURLRequest *request = [NSURLRequest requestWithURL:myUrl 
      cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];
[webView loadRequest:request];

这似乎在iOS 4.3上运行良好,但在iOS 3.0上根本不起作用。我通过将设备指向Charles proxy(在iPhone上,设置 - > WiFi,手动代理)并将流量记录到我的服务器来测试了这一点。

UIWebView是否开始在iOS 4.0中观察缓存策略?其他人可以证实这一点,还是只是想象一下?

3 个答案:

答案 0 :(得分:3)

是的,在iOS 4.0中,缓存开始工作。

在Foundation框架中有一个类负责处理它,它是NSCache。它已经在Mac OS X中使用了很长时间,但直到iOS 4.0才在iOS中实现。即便如此,它只是部分实现:它不支持磁盘缓存,而只支持内存缓存(因此,由于系统请求时释放内存,缓存非常不可靠)。

NSCache在iOS 5.0中收到了更新,增加了对磁盘缓存的支持,现在它的工作方式与Mac版本相同,可以毫无问题地使用。

答案 1 :(得分:-1)

我刚检查了NSURLRequest.h

iOS SDK中的大多数代码都有一个版本控制断言,它有一个if语句,如下所示:

#if __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED

但方法

- (id)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval;

似乎没有任何这样的东西,因此我猜它一直存在。

答案 2 :(得分:-2)

NSURLCache* theCache = [NSURLCache sharedURLCache];
[theCache setMemoryCapacity:4 * 1024 * 1024];
[theCache setDiskCapacity:512*1024];

[NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0];