我的应用程序的一部分缓存网页以供离线查看.为此,我保存从站点获取的HTML并重写img urls以指向本地存储上的文件.当我将html加载到UIWebView中时,它会按预期加载图像,一切都很好.我也是以这种方式缓存样式表.
问题是,当我将手机置于飞行模式时,加载此缓存的html会导致UIWebView显示空白屏幕并在显示页面之前暂停一段时间.我发现它是由Web视图试图获取的原始HTML文档引用的非缓存URL引起的.这些其他URL包括缓存样式表中的图像,iframe中的内容以及用于打开连接以获取其他资源的javascript.当UIWebView尝试获取这些资源时会发生暂停,并且只有在所有这些其他提取超时后才会显示该网页.
我的问题是,如何让UIWebView显示我立即缓存的内容?这是我的想法:
写更多代码来缓存这些其他引用.这可能需要更多代码来捕获所有边缘情况等,尤其是必须解析Javascript以查看在加载页面后它加载的内容
强制UIWebView立即超时,所以没有暂停.我还没弄明白怎么做.
以某种方式获取已经加载的内容,即使外部引用尚未完成提取
剥离所有脚本的代码,链接标签和iframe以"擦除"外部引用.我试过这个,但对于某些网站,结果页面严重搞砸了
有人能帮我一下吗?我一直在努力解决这个问题,而且我的想法已经不多了.
编辑:只是指出这个问题及其答案已有4年了.我正在聊聊下面的iOS 3.x. 我可以很容易地想象事情在此期间发生了变化 - 哎呀,单独的设备比iPhone 3G更快.因人而异.:)
我一直在看这个过去,但实际上并没有实现任何东西,只是谷歌搜索.总的来说,使用DontLoad在iPhone上执行此操作非常困难/不可能.即使在3月份,也有报道说它可以在Simulator中运行,但不能在设备上运行:http://discussions.apple.com/message.jspa?messageID = 9245292
我只是猜测,但基于其他StackOverflow问题(例如这个),我想也许设备上的缓存在某种程度上比它的Mac和Safari同行更有限.
Apple论坛上的其他人在询问UIWebView和NSURLCache时报告了粗鲁工程师的经验,在bug报告中,工程师说它应该有效,但实际的开发人员说它没有.http://discussions.apple.com/thread.jspa?threadID=1588010(7月 29日 - 8月20日)
可以在这里找到一些解决方案.考虑到[UIImage imageWithData:...],David描述了"用于iPhone的异步缓存图像下载器的实现"的一些代码.
现在我在cocoa-dev邮件列表上发现了这个8月10日的电子邮件:
2009年8月10日下午1:38,Mike Manzano写道:
有没有人能够在iPhone上成功获取URL加载系统以关注NSURLCache的自定义版本?在我看来,它被忽略了.更多信息:
[此页面的链接; 删除.]
(见该页的第二个"答案").
如果我做错了或者我的代码被忽略了,只需要某种线索.
是的,我已经有了它的工作 - 它只需要创建自己的缓存实例并明确地将共享缓存设置为该新实例.
但它绝对有效 - 一旦实现,我的"将表视图单元格的图像设置为网络中的图像"工作得很好(并且没有它滚动是最痛苦的).
Glenn Andreas gandreas @ xxxxxxxxxxxx http://www.gandreas.com/邪恶的乐趣!疯狂,坏,并且知道危险
以上电子邮件可在http://www.cocoabuilder.com/archive/message/cocoa/2009/8/10/242484找到(没有进一步的回复)
可以在iCab博客中找到NSURLCache可以工作的进一步证据:iPhone上的UIWebView的URL过滤(2009年8月18日)
这里的任何人都可能也应该关注Apple的URLCache示例应用程序,因为它可能与他们的工作相关:https://developer.apple.com/iphone/library/samplecode/URLCache/index.html除了刚刚看过它,它说:"此应用程序不使用NSURLCache磁盘或内存缓存,因此我们的缓存策略是通过从其源加载数据来满足请求." 和用途cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
.所以这不像我想的那么重要,为什么这个人称 NSURLCache是个笑话.
因此,看起来NSURLCache并不像我开始这篇文章那样棘手或不可能.喜欢找到一种有效的方法,同时研究它不起作用的原因.我仍然无法相信"iphone"和"NSURLRequestReturnCacheDataDontLoad"只有25个Google搜索结果......这个答案几乎包含了每一个.而且我很高兴我写了它以便稍后可以参考;-)