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 インスペクターではまだ HTTP 200 です。つまり、キャッシュされます。

PZProtocolHandler ON : Web インスペクターは 3 回の試行を報告し、それぞれ 10 秒後にタイムアウトになり、HTTP 404 になります。それ以上リロードしても変化はありません。ここで興味深いのは、wire(shark) によると、リクエストは送信され、適切な HTTP 200 で応答されます。"Someone" は に向かう途中で 404 を構成していUIWebViewます。

さて、巧妙なブログを読む前であっても、サーバーの応答にCache-Controlヘッダーが含まれていない場合、iOS の URL キャッシュが熱核になることがわかりました。そして、この特定の GET リクエストはそのような場合です。しかし、それで 404 エラーが発生することはありません。また、さまざまな方法でデフォルトのキャッシュを休止状態にしようとしました。 でキャッシュ関連のデリゲート呼び出しを実装しNSURLProtocol、キャッシュ禁止フラグを使用して新しいリクエストを作成し、で予想されるトップナレッジを使用し、「ヌルキャッシュ」であると思われるものSDURLCacheに置き換えました。プロジェクト ソースのすべてを参照してください。NSURLCache

404は私にとって持続します。オーバーライドNSURLProtocolするという単なる事実が物事をそれほど壊すとは思えません。そのためのレーダーを埋める機会がなければ、私は生きることができませんでした、ありがとう。私はまだ何か間違ったことをしていることを願っています。

4

1 に答える 1

0

問題は正確に解決されたわけではなく、少し狭められてクリアされたようです。新しい質問が発生した場合、それはおそらく非常に異なるものになるので、私はこれに自己回答しています.

したがって、おそらくキャッシュの問題ではありません。explicitNSOperationQueueが割り当てられている場合、サイトは通常どおり読み込まれます。

_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これは、インターネット上の多数のハウツーのいずれにも表示されません。なぜそんなに改善されたのかを知っていると主張するのは不適切な自信がありますが、問題のある Web サイトは Mobile Safari とほぼ同じくらいスムーズに読み込まれるようになり (JavaScript の実行速度の差が予想される範囲内で)、問題は解決しました。

于 2014-09-10T14:34:41.950 に答える