0

如果您认真回答这个问题,请克隆我创建的迷你应用程序,看看它是否对您有同样的行为不当,然后再推测答案,谢谢 :)

https://github.com/pavel-zdenek/nsurlprotocol-testbed

一个非常简单的浏览器:UIWebView所有请求都经过简单的NSURLProtocol重新实现。它经过了加载时间。开关在运行时取消/注册协议处理程序。现在加载一个特定站点:http ://www.rollingstone.com 。除了大量其他资源之外,页面 GET

http://sjc.ads.nexage.com/js/admax/admax_api.js

这会产生一个 XHR 请求

http://sjc.mediation.nexage.net/admax/adMaxApi.do?dcn=<somehash>

PZProtocolHandler OFF : XHR 立即加载。在网络上观察到 HTTP 200(鲨鱼),反映为 Safari Web Inspector 中的成功加载。在进一步加载时,它不再在线,但仍然是 Web Inspector 中的 HTTP 200。换句话说,缓存。

PZProtocolHandler ON:Web Inspector 报告 3 次尝试,每次 10 秒后超时,导致 HTTP 404。进一步重新加载后没有变化。现在有趣的部分:根据wire(shark),请求发出并以正确的HTTP 200响应。此外,所有3次尝试都在一个相同的TCP通道上排序。“某人”沿途编造404 UIWebView

现在,甚至在阅读聪明的博客之前,我就发现当服务器响应不包含Cache-Control标头时,iOS URL 缓存会变成热核。而这个特殊的 GET 请求就是这种情况。但它不应该导致 404 失败,不是吗?我还尝试通过各种方法使默认缓存休眠:实现与缓存相关的委托调用NSURLProtocol,创建带有缓存禁止标志的新请求,使用预期的顶级知识SDURLCache,甚至替换NSURLCache认为应该是“空缓存”的东西。查看项目源代码中的所有内容。

404 对我来说仍然存在。我怀疑仅仅覆盖的事实NSURLProtocol会破坏这么多事情。我可以没有机会为此填补雷达,谢谢。我仍然希望我做错了什么。

4

1 回答 1

0

这个问题并没有完全解决,更像是缩小和清除了一点。如果出现一个新问题,它很可能会非常不同,所以我自己回答这个问题。

所以这可能不是缓存问题。NSOperationQueue分配显式时,站点正常加载:

_connection = [[NSURLConnection alloc] initWithRequest:request
                                            delegate:self
                                    startImmediately:NO];
// comment out for sure stalling
[_connection setDelegateQueue:[NSOperationQueue mainQueue]];
[_connection start];

我很想更喜欢currentQueue,但那是nil[NSURLProtocol startLoading]. 根据Apple doc ,这应该意味着它本身startLoading不是一个NSOperation,因此没有队列。

显式路由到主线程显然会带来不同的性能瓶颈:当与 UI 交互时,委托调用会停止,最典型的是尝试滚动部分加载的页面时。虽然这也是一个问题,但我可以用它来填充 Apple TSI。任何新知识都会去github repo

更新:

现在通过做另一件简单的事情完全解决了这个问题:创建一个新的香草NSOperationQueue并将NSURLConnectionDelegate队列设置为它:

[_connection setDelegateQueue:_theNewlyCreatedQueue];

您不会NSURLProtocol在互联网上的众多方法中看到这一点。声称我知道为什么它改进了这么多东西是不恰当的自信,但现在有问题的网站加载几乎和 Mobile Safari 中一样顺利(在预期的 JavaScript 执行速度差异内),所以问题为我解决了。

于 2014-09-10T14:34:41.950 回答