我一直在测试一个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中观察缓存策略?其他人可以证实这一点,还是只是想象一下?
答案 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];