11

NSURLCacheで頭を悩ませるのに非常に長い時間を費やしたばかりなので、他の人が私の不幸を回避できることを願って、このちょっとしたアドバイスを提供します。

それはすべて合理的に十分に始まりました。私の新しいアプリプロジェクトはiOS5以降のみを対象としているため、すべてのWebキャッシングのニーズに新しいNSURLCache実装を利用できると思いました。いくつかの特別なタスクを処理するためにNSURLCacheのカスタムサブクラスが必要でしたが、それはすべてAPIによって有効にサポートされているようでした。ドキュメントをざっと読んで、私はレースに出かけます:

[NSURLCache setSharedURLCache:[[MyCustomCache alloc] initWithMemoryCapacity:8 * 1024 * 1024 //8mb 
                                                                    diskCapacity:32 * 1024 * 1024 // 32mb 
                                                                        diskPath:@"webcache.db"]];

8 MBのキャッシュを開始するのが適切だと思います。より大きなディスクキャッシュでバックアップして、より大きなイメージをローカルで提供できるようにします。残りのネットワークコードをフックしてNSURLConnectionを使用し(実際にはMKNetworkKitを使用しましたが、それは無関係であることが判明しました)、キャッシュから素晴らしいことを期待しています。案の定、キャッシュされるはずのすべてのリクエストは忠実にキャッシュに保存されており、応答はキャッシュから提供されると忠実にすばやく返されます。これは、ペンザンスの海賊の定期的な制作であり、私のネットワークスタックで非常に多くの義務が飛び交っています。

何かが足し合わないことを除いて。キャッシュから処理できるリクエストは、引き続きネットワーク経由で送信されます。そうでない場合を除いて。キャッシュが実際にリクエストを処理するために使用されているかどうかは、完全にランダムで断続的に見えます。私は欲求不満で髪を引き裂き、何が起こっているのかを理解しようと文字通りすべてを掘り下げます。私はテストアプリを構築し、あらゆる場所にブレークポイントを設定し、パケットトレースを切り取り、NSURLCacheに言及しているインターネット上のすべての単語を読み、キャッシュ制御ヘッダーを試し、コードをコメントアウトし、サブクラスをバイパスし、さらには丹念にトレースします。 NSURLCacheとそのCFNetworkingの友人が、その下にある不思議な論理を理解しようとするためのアセンブリ。私はARMとObjective-Cの呼び出し規約の知識を大幅に向上させ、低レベルのデバッグについてかなり学びますが、実際に何が起こっているのかを理解することはできません。全体がイオランテの悪夢の歌のように感じています海賊王の良心的な独裁政権よりも、私はそれをすべて捨てる寸前です。

TL / DRバージョン:NSURLCacheは機能しているように見えますが、キャッシュされた結果が利用可能であっても、ランダムに返されません。

4

2 に答える 2

9

最終的に、私は私がいじっていたすべてのビットの異なる順列を試します。メモリとディスクの両方のキャッシュサイズを8MBに設定しました。

見よ、すべての奇妙さが消える!キャッシュされるはずのすべてが保存されます。そして、キャッシュから来ることになっているすべてのものは、ネットワーク要求なしで提供されています。

iOS5でのNSURLCacheの実装はまだ完了していないようです。ディスクキャッシュとメモリキャッシュを使用しますが(iOS4以前はメモリ内キャッシュのみを実装していました)、要求が失敗したときに実際にはメモリキャッシュを介してディスクキャッシュに渡されません。そのため、特定の応答が適切なタイミングでメモリ内にあるかどうかは、基本的にブラインドラック(他のすべてのネットワークとキャッシュの使用に影響されるブラインドラック)です。これは、デバイス上のフラッシュメモリファイルのIOを減らすのにおそらく役立ちますが、クラスからの合理的な動作を期待する場合はめちゃくちゃ不快です。

そして、笑いの歌と陽気なダンスで、私は2行の修正をチェックインし、バーを急いで、最終的にこの知識をSO(およびAppleのバグレポート)と共有して、他の誰もこれを経験する必要がないことを願っています痛みがぶり返す。

この悲惨な話の教訓: iOS5でメモリ容量よりも大きいディスク容量でNSURLCacheを使用しようとすると、奇妙で​​邪悪なことが起こります。これをしないでください。そして、魔法の妖精の敵を作ることは避けてください。

于 2012-07-16T03:57:09.620 に答える
2

FWIWはこれが私の最終的な解決策です:

https://gist.github.com/3245415

FMDBを使用する必要がありますが、結果はかなり良好です。

于 2012-08-07T06:04:15.313 に答える