1

MKNetworkKitキャッシングで非常に珍しい問題に直面しています。簡単に言えば、問題は「機能していない」ということです。

問題のある簡単なテストプロジェクトを作成しました。プロジェクトは何もしませんが、 http://where.yahooapis.com /に単純なGETリクエストを送信して、都市名のアドレスまたは情報を取得します。応答は、最初に実行したときに追跡されることになっており、2回目から、完了ハンドラーが2回呼び出されます。1回はキャッシュされた応答で、もう1回はフェッチされた応答で呼び出されます。以下に示すように、これはhttp://blog.mugunthkumar.com/coding/ios-tutorial-image-cache-and-loading-thumbnails-using-mknetworkkit/から取得されます。

MKNetworkKitは、2回目の呼び出しを行う場合、キャッシュされたデータを使用して同じ完了ハンドラーを呼び出します。ネットワーク接続が適切な場合、MKNetworkKitは完了ハンドラーを2回呼び出します。最初にキャッシュされたデータを使用し、サーバーから最新のデータを取得した後に再度使用します。

まあ、珍しいことは、私がアプリを実行した、それがキャッシュされなかった、私が再びアプリを実行した、それが再びキャッシュされなかった、いくつかのランダムな実行が突然キャッシュが機能し始めた後です。アプリを削除して再度実行すると、ランダムに実行されて問題が繰り返されるまでキャッシュが機能しません。

参考までに、 GITからダウンロードした最新のMKNetworkkitを使用しました。

それが私のコードに問題があるのか​​、それともMKNetworkKit自体に問題があるのか​​わかりません。そのため、コードを確認して、この問題の原因が私であるかMKNetworkKitであるかをお知らせください。

サンプルプロジェクトをダウンロードするためのリンクは次のとおりです[https://www.box.com/s/tsfw3z0avpti051xbyhv]4

少し早いですがお礼を。

4

1 に答える 1

5

最後に、私はそれを理解することができます..!キャッシング中に何が起こるかは次のとおりです。

MKNetworkKit キャッシングは超軽量で、応答を NSMutableDictionary にキャッシュします。それは高いメモリ使用量につながりませんか?はい。もちろん、MKNetworkKit は賢いです。UIApplicationDidReceiveMemoryWarningNotification を監視し、ディクショナリをディスクにフラッシュします。次にキャッシュされた URL にリクエストを行うと、キャッシュされたデータがメモリに戻されます。つまり、メモリ内キャッシュとディスク キャッシュがあり、最近使用されていないアルゴリズムを使用してアイテムをディスクにフラッシュします。MKNetworkEngine クラスには、キャッシュ コストを制御するためにオーバーライドできるメソッドがあります。

つまり、アプリを初めて実行したときに、応答が「ディスク」ではなく「メモリ」にキャッシュされたということです。アプリをコールドスタートすると、先ほどキャッシュしたレスポンスが「メモリ」から「ディスク」に転送されませんでした。(これが、アプリケーションのキャッシュ ディレクトリにキャッシュされたファイルさえなかった理由です..!) したがって、successBlock がキャッシュされた応答で 2 回呼び出されることはありませんでした。

この問題を解決するには、1 行のコードで 1 つの関数をオーバーライドするだけです...!

- (int) cacheMemoryCost
{
    return 0;
}
于 2012-11-30T10:31:13.260 に答える