问题标签 [nsurlcache]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4297 浏览

iphone - UIWebView 和 NSURLCache 关系有问题

我正在尝试解决我的两件事UIWebView

  1. 在适当的条件下加载本地资产代替远程资产
  2. 如果没有本地资源或它们已过时,则正常加载远程资源
  3. 允许 webview “返回”而不需要从服务器重新加载它的 html

所以为了处理#1 和#2,我实现了一个自定义子类NSURLCache。它在 webview 请求资产时被调用,而我可以发送本地的,中止服务器对资产的调用。我什至有一个小时间戳系统,它知道本地版本是否旧,以确定使用哪个版本。

但是#3让我陷入困境。似乎无论缓存控制标头如何,UIWebView返回时总是会重新加载 HTML。

所以我试图在我的自定义NSURLCache类中强制缓存 HTML。它似乎可以工作,并返回NSCachedURLResponse带有我想要的 HTML 的实例,但是UIWebView无论如何都没有注意到并从服务器加载它。经过一番搜索,我发现 url 缓存存在一些“不一致” UIWebView,我想这是其中之一。对资产很有效,但对构成它试图显示的页面的 HTML 来说不是很好。

所以我决定,因为这可能行不通,所以手动做。我创建了一堆 url,以及我手动获取并使用loadData:MIMEType:textEncodingName:baseURL:. 瞧,它似乎工作得很好!我现在可以回去了,Web 视图委托将拦截负载,并告诉它加载我手动获取的数据,并且服务器不会被击中。

但是,后来我注意到 NSURLCache 不再用于我的资产。loadRequest:如果您加载内容而不是加载数据或带有正确设置的html字符串,它似乎只要求缓存资产baseUrl

因此,尽管我付出了所有努力,但我无法使 Web 视图有条件地加载本地资产并在不访问服务器的情况下导航回来。似乎我在 SDK 中有一些错误。

  1. UIWebView忽略Cache-ControlHTML 内容的服务器标头
  2. UIWebView请求NSCachedURLResponse主 HTML 请求的 's,但随后被忽略并丢弃。
  3. UIWebView如果您通过请求加载它会询问NSURLCache资产,但是当加载 HTML 或数据时,它会完全绕过缓存并直接从远程服务器请求它。

所以首先,有人看到这些事情的解决方案吗?其次,有什么理由说我很愚蠢而且这些实际上不是 SDK 错误吗?

0 投票
4 回答
6669 浏览

nsurlconnection - 可变的 NSHTTPURLResponse 或 NSURLResponse

我需要修改 NSURLResponse 中的响应标头。这可能吗?

0 投票
3 回答
4832 浏览

iphone - NSURLCache 内存大小为零

我在使用同步调用缓存 NSURLConnection 响应时遇到问题。我在一个类中初始化缓存,然后在另一个类中使用它。请注意高速缓存容量如何被初始化为 100KB,但随后又神奇地重置为零。

在另一个班级...

0 投票
1 回答
2549 浏览

objective-c - NSURLCache 与自动释放的对象一起崩溃,但否则会泄漏

CSURLCache旨在缓存资源以供离线浏览,因为NSURLCache仅将数据存储在内存中。

如果cachedResponse在返回应用程序崩溃之前自动释放,如果没有,则对象只是泄漏。

任何可以阐明这一点的光都将不胜感激。

请注意stringByEncodingURLEntities是一个分类方法NSString

更新:向 Apple 提交雷达后,这似乎是一个已知问题 (Radar #7640470)。

0 投票
3 回答
3360 浏览

iphone - iPhone:NSURLRequestCachePolicy 设置之间的性能差异

在 iPhone 上使用NSURLRequest时,各种NSURLRequestCachePolicy设置之间的实际性能差异是什么?我对缓存策略对用户感知 UIWebView 页面显示速度的影响特别感兴趣。

我一直在使用默认值NSURLRequestCachePolicy,但我认为 NSURLRequestReloadRevalidatingCacheData 可能最适合大多数情况,尤其是在返回上一页时。

如果您在实际条件下使用了各种缓存策略,那么哪种策略在特定情况下被证明是最佳的?哪种策略可在三种不同类型的 iPhone 连接(wi-fi、3G 和 Edge)上提供最佳整体性能?缓存策略对用户对页面加载速度的感知是否有任何显着影响,还是我应该寻找其他地方来优化 UIWebView 的显示时间?

更新:

似乎有一个共识,即 UIWebView 似乎忽略了给定它的任何 NSURLRequest 上的缓存设置。我不完全相信这是最终答案,但除非有时间进行一些广泛的测试,否则我不能否认它。因此,我接受评分最高的答案。但是,如果这件事对您的项目很重要,我建议您对答案持保留态度。——TechZen。

0 投票
3 回答
7149 浏览

iphone - NSURLCache 缓存响应问题

我正在编写一个 iPhone 应用程序,其中一个选项卡是 twitter 提要,我正在解析 twitter xml 并将其很好地放在表格视图中。如果没有互联网连接,我想显示上次我们有互联网连接并更新表格时的缓存结果。我正在使用 NSURLCache ,如下所示:

我可以看到 NSLog 第一次输出“没有得到响应”,因为这是第一次访问这个网站(http://www.twitter.com/..)我还可以看到响应正在被缓存,因为我实现了将在 initWithRequest 启动后调用的 willCacheResponse 方法,如下所示:

第二次访问这个站点时,我可以清楚地看到 NSLog 输出“Got Response”,这意味着缓存命中,因此不应该再次调用 willCacheResponse,但由于某种奇怪的原因,它被一次又一次调用并且不拉缓存中的信息,而是尝试再次缓存它。

知道是什么导致了这个问题吗?

谢谢!

0 投票
1 回答
643 浏览

cocoa - 如何共享 Safari 的 NSURLCache 存储?

背景

  • 我正在构建一个将您最近访问过的网页链接在一起的应用程序。

  • 为此,我需要使用 Cocoa 获取最近 URL 的 HTML。

  • 现在,我正在使用不可见的 WebView 来执行此操作。

  • 据我了解,如果 URL 不在我的应用程序的缓存中,那么这就是在访问 Web 服务器。

我想要的是

我抓取的 URL 很有可能已经被 Safari 缓存,因为该页面已经被访问过。

我希望我的应用程序首先检查 Safari 的缓存中的 URL。如果它在那里,它应该只使用这些数据。如果没有,它应该访问 Web 服务器并将页面存储在我的应用程序的缓存中。

我真的不想使用 sqlite3 从 Safari 解析 cache.db 文件——我不知道这种格式是否会保持不变。我追求更简单、更高层次的东西。

我试过的

我知道您可以使用该方法设置自己的 NSURLCache ,initWithMemoryCapacity:diskCapacity:diskPath:但我不想尝试将其指向 Safari 缓存,以防它通过写入来破坏 Safari。

是否有一种简单、高级的方式来共享 Safari 缓存?

更新

啊哈。我刚刚意识到可能有一种方法可以做到这一点,我一直在想念。

我可以创建一个NSURLCachewith的新实例,将其initWithMemoryCapacity:diskCapacity:diskPath:指向 Safari 缓存,然后NSURLRequestReturnCacheDataDontLoad在加载页面时为 URL 请求指定缓存策略。

当这失败时,我可以尝试正常加载页面。当我知道更多时,我会尝试这个并更新问题。

0 投票
0 回答
2277 浏览

iphone - iPhone上的自定义NSProtocol和缓存问题

我的 iPhone 应用程序嵌入了一个 UIWebView,它通过我注册的自定义 NSProtocol 处理程序加载 html。

我的问题是返回的 html 中引用的资源(也通过我的自定义协议处理程序加载)被缓存并且永远不会重新加载。特别是,我的样式表被缓存:

在 UIWebView 中加载 html 的初始请求如下所示:

(请注意缓存策略设置为忽略,并且我已经验证此缓存策略会在初始加载时对页面资源的后续请求进行)

协议处理程序从数据库加载 html 并使用如下代码将其返回给客户端:

(注意响应缓存策略是“不允许的”)。

有什么想法可以让它不缓存我的 styles.css 资源吗?我需要能够在后续加载引用此文件的 html 时动态更改此资源的内容。

我认为清除共享 url 缓存会起作用,但它没有:

确实有效但效率极低的一件事是通过添加时间戳参数来动态缓存样式表的 url:

为了完成这项工作,我必须从数据库加载我的 html,搜索样式表的 url 并将其替换为每个请求都会更改的缓存清除参数。我宁愿不这样做。

我的假设是,如果我通过内置的 HTTP 协议加载我的内容是没有问题的。在这种情况下,我猜测 UIWebView 会查看 NSURLHTTPResponse 对象的 http 标头中的任何 Cache-Control 标志并遵守它们。由于我的 NSURLResponseObject 没有 http 标头(它不是 http ...),那么 UIWebView 可能只是决定缓存资源(忽略 NSURLRequest 缓存指令?)。

想法???

0 投票
1 回答
3274 浏览

iphone - UIWebView NSURLRequestReloadIgnoringLocalCacheData 实际上并没有忽略缓存

我有一个 UIWebView 对象,缓存策略指定为: NSURLRequestReloadIgnoringLocalCacheData

这应该忽略本地缓存中的任何对象并从 Web 检索站点的最新版本。

但是,在站点的第一次加载(跟踪中的十个资源,HTTP GET)之后,站点的所有后续加载仅检索一小部分资源(跟踪中的三个资源,HTTP GET)。这些图像似乎都是从某个本地来源加载的。

我已经确认我的 sharedURLCache 的内存使用量为 0 字节,磁盘使用量为 0 字节。每当该过程重新开始时,就会再次检索该站点的完整版本。这让我相信这些资源存储在内存缓存中,但正如我之前提到的,[[NSURLCache sharedURLCache] currentMemoryUsage] 返回 0。

我也尝试过明确删除我的请求的缓存响应,但这似乎没有效果。是什么赋予了?

编辑:此外,NSHTTPCookieStorage 在每次加载之前都会被清除,我可以确认后续加载现在检索四个资源而不是三个。无论更改如何,缓存问题仍然存在。

0 投票
1 回答
1194 浏览

uiwebview - iPhone 上 UIWebView 的 URL 过滤

有人可以说明我将如何使其工作: http: //www.icab.de/blog/2009/08/18/url-filtering-with-uiwebview-on-the-iphone/

我尝试在我的项目中制作“FilteredWebCache.h”和“FilteredWebCache.m”文件,但它说“FilterManager.h”不存在。我打算如何处理这些文件?

我把这个放在 viewDidLoad 中: