我已经看过几个关于这个问题的帖子,我无法弄清楚如何使这个工作。例如,这篇文章NSCachedURLResponse returns object, but UIWebView does not interprets content
建议我们继承并覆盖cachedResponseForRequest
并在返回缓存响应之前修改NSURLRequest
(不确定为什么需要这样做)。
这是我在NSURLCache
子类中的代码:
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {
NSCachedURLResponse *resp = [super cachedResponseForRequest:request];
if (resp != nil && resp.data.length > 0) {
NSDictionary *headers = @{@"Access-Control-Allow-Origin" : @"*", @"Access-Control-Allow-Headers" : @"Content-Type"};
NSHTTPURLResponse *urlresponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL statusCode:200 HTTPVersion:@"1.1" headerFields:headers];
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:resp.data];
return cachedResponse;
} else {
return nil;
}
}
现在,当我通过webview加载请求并且我处于脱机状态时,委托didFailLoadWithError
被调用(无法加载),但在调用该委托方法之前,我的cachedResponseForRequest
方法被调用,缓存的响应有一些html,但我的didFailLoadWithError
方法仍然被调用。所以我的问题是,如果我们从webViewDidFinishLoad
返回缓存的响应,是否应调用NSURLCache
,如果不是,我该如何使其工作?
我在didFinishLaunchingWithOptions
:
NSUInteger cacheSizeMemory = 500*1024*1024; // 500 MB
NSUInteger cacheSizeDisk = 500*1024*1024; // 500 MB
NSURLCache *sharedCache = [[CustomCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
[NSURLCache setSharedURLCache:sharedCache];
这是我想要的工作流程:
UIWebView
尝试点击网址,但设备处于离线状态,并返回返回的缓存响应。对我的代码中需要更改的内容的任何想法都表示赞赏!
答案 0 :(得分:0)
NSURLCache
专为HTTP一致性缓存而设计,并且通常表现得很意外。您必须为您的用例编写自己的缓存,并实现自定义NSURLProtocol
以使用它。该协议将响应放入缓存中,并在脱机时从缓存中提供它们。 Rob Napier对此问题excellent article。