【问题标题】:loadrequest cannot find cache entry that I created with NSURLCacheloadrequest 找不到我用 NSURLCache 创建的缓存条目
【发布时间】:2014-02-18 20:54:27
【问题描述】:

我可以通过以下方式创建缓存条目:

[[NSURLCache sharedURLCache] storeCachedResponse:cachedURLresponse forRequest:request];    

对于网址http://www.punkoffice.com/hello.html

如果我在看到我的缓存条目存在后直接运行它

NSLog(@"cache = %@",[[NSURLCache sharedURLCache] cachedResponseForRequest:request]);

我可以在 SQLite 数据库文件中看到它。

但是,当我使用完全相同的请求执行加载请求时:

[self.webView loadRequest:request]

未找到该请求的缓存条目,并创建了一个新条目。它最终会覆盖我之前放入的缓存条目。

如何获取 loadRequest 以查看我使用 storeCachedResponse 存储的缓存条目?

(编辑) 这是我用来创建缓存条目的完整代码。我可以告诉这个位有效,因为它存在于缓存数据库中,我可以从 cachedReponseForRequest 中检索它

NSString *strURL = @"http://www.punkoffice.com/hello.html";
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:strURL]];
NSString *strData = @"<html><body>Some other content</body></html>";
NSData *dataContent = [strData dataUsingEncoding:NSUTF8StringEncoding];

NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[NSURL URLWithString:strURL] MIMEType:@"text/html" expectedContentLength:[dataContent length] textEncodingName:nil];
NSCachedURLResponse *cachedURLresponse = [[NSCachedURLResponse alloc] initWithResponse:response data:dataContent];

我也尝试过像这样添加标题:

NSDictionary *headers = @{@"Cache-Control":@"max-age=3600"};
NSHTTPURLResponse* httpResponse = [[NSHTTPURLResponse alloc] initWithURL:[NSURL URLWithString:strURL] statusCode:200 HTTPVersion:@"HTTP/1.1" headerFields:headers];
NSCachedURLResponse *cachedURLresponse = [[NSCachedURLResponse alloc] initWithResponse:httpResponse data:dataContent];

【问题讨论】:

    标签: ios objective-c caching uiwebview


    【解决方案1】:

    我遇到了同样的问题。为了解决这个问题,我这样做了。

        NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
        if (cachedResponse) {
            [myWebView loadData:cachedResponse.data MIMEType:cachedResponse.response.MIMEType textEncodingName:cachedResponse.response.textEncodingName baseURL:request.URL];
        }
        else{
            [myWebView loadRequest:request];
        }
    

    不确定,但在我看来 UIWebViewloadRequest 方法总是忽略 cachePolicy 并且总是尝试连接到 request URL 的服务器而不是查看缓存。

    【讨论】:

    • 这适用于加载网页,谢谢!现在我正试图让它为网页中的资源工作。我现在在 hello.html 页面中有一个图像 dancer.jpg。因此,如果我为 dancer.jpg 插入缓存条目并通过您的方法调用 hello.html 它找不到缓存条目,但如果我使用您的方法直接访问 www.punkoffice.com/dancer.jpg 它确实找到缓存条目。我不确定如何将您的解决方法应用于网页中的资源。
    • 我见过人们将他们手动创建的缓存条目存储在字典中。我有一种不好的感觉,这是存储和检索缓存条目的唯一方法。我真的希望使用现有的缓存数据库,而不是将所有新的缓存响应存储在内存中。
    • 我与默认缓存有过类似的斗争,我觉得默认缓存不太可靠。可能这就是为什么许多开发人员以 NSDictionary/NSData 的形式存储响应/资源的原因。我建议您另一种选择将整个响应保存在核心数据中。看看是否符合您的要求。
    • 我能够创建自己的缓存存储并覆盖现有的 NSURLCache 函数以使用该存储。那是我最后的手段。所以我猜它不可能按原样使用现有的 NSURLCache 函数和官方缓存数据库。
    【解决方案2】:

    创建NSURLRequest时需要指定cachePolicy

    + (id)requestWithURL:(NSURL *)theURL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval
    

    cachePolicy 的值应该是 NSURLRequestReturnCacheDataElseLoad。

    NSURLRequestReturnCacheDataElseLoad

    指定现有的缓存 数据应用于满足请求,无论其年龄或 截止日期。如果缓存中没有现有数据 对应于请求,数据从原始加载 来源。

    为了利用 NSURLCache,必须初始化和设置共享 URL 缓存。

      NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 
                                                           diskCapacity:20 * 1024 * 1024 
                                                               diskPath:nil];
      [NSURLCache setSharedURLCache:URLCache];
    

    您还应该确保响应包含 Cache-Control HTTP 标头。此标头必须存在于服务器的响应中,以启用客户端的 HTTP 缓存。

    【讨论】:

    • 这没什么区别。它仍然用网页的内容覆盖它。我正在使用这个:NSString *strURL = @"http://www.punkoffice.com/hello.html";NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:strURL] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0];[self.webView loadRequest:request];
    • 你在初始化你的 NSURLCache 吗?我更新了我的答案。看看吧。
    • 是的。我将这些确切的数字用于内存和磁盘容量,但将 diskPath 设置为“webcache.db”。我已经把它放在了didFinishLaunchingWithOptions 的AppDelegate 中。我可以通过检查 webcache.db 的内容来判断我的缓存条目已添加,并且 cachedResponseForRequest 也可以找到它。我想知道,这对你有用吗?
    • 我尝试添加缓存头。我修改了原始帖子以显示我是如何做到的。不幸的是,这也不起作用
    猜你喜欢
    • 1970-01-01
    • 2014-09-27
    • 2020-01-11
    • 2013-09-05
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2014-04-27
    • 2011-10-11
    相关资源
    最近更新 更多