我看过好几篇关于这个问题的帖子,我想不出如何才能做到这一点。例如,这篇文章是NSCachedURLResponse返回对象,但UIWebView不解释内容。
建议我们在返回缓存的响应之前,对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尝试点击url,但是设备离线,返回一个返回的缓存响应。任何在我的代码中需要修改的想法都是非常感谢的!
发布于 2016-12-21 06:42:39
NSURLCache是为HTTP一致性缓存而设计的,并且常常表现出意想不到的行为。您必须为用例编写自己的缓存,并实现一个自定义NSURLProtocol来使用它。该协议将响应放入缓存中,并在脱机时从缓存中提供响应。罗伯·纳皮尔( Rob )在这方面惹恼了优秀文章。
https://stackoverflow.com/questions/41254059
复制相似问题