UIWebView何时开始支持缓存?

13

我一直在测试一个使用UIWebView加载外部内容(而不是项目捆绑资源)的iPhone视图控制器。另一位工程师注意到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 代理(iPhone 上为“设置” -> “Wi-Fi”,手动代理)并记录到我的服务器上的流量来测试它。

在 iOS 4.0 中,UIWebView 是否开始观察缓存策略?有其他人可以确认这一点,还是我只是想象出了这个问题?


1
我在iOS 4.0上进行了测试,没有使用缓存策略,只是使用[NSURLRequest requestWithURL:myUrl],看起来它是从缓存中加载的。 - goldierox
我认为这个链接会对你有所帮助...https://dev59.com/y0zSa4cB1Zd3GeqPlERj?rq=1 - junaidsidhu
3个回答

3

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

在Foundation框架中有一个类负责处理缓存,它叫做NSCache。它从Mac OS X时代就存在了,但在iOS中直到iOS 4.0才被实现。即使在那时,它也只是部分实现:它不支持磁盘缓存,只支持内存缓存(因此由于系统释放内存而导致缓存非常不可靠)。

NSCache在iOS 5.0中进行了更新,增加了对磁盘缓存的支持,现在像Mac版本一样正常工作,可以毫无问题地使用。


这有点奇怪,因为iOS本身直到5.0才开始支持磁盘缓存。我回过头去测试了一下,发现iOS 4.0的缓存略微不可预测,而iOS 5.0则符合预期。这可能是因为直到那时磁盘缓存才被完全实现。 - goldierox
啊,时间表弄错了。请查看已编辑的答案,现在应该是正确的了。 ;) - EliaCereda

-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;

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


1
这个方法从Mac OS X的10.2版本开始就存在了,所以它在iOS中一直存在。问题是UIWebView多久以来正确执行指定的缓存策略。 - goldierox

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

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

3
这并没有回答任何问题。 - goldierox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接