4

今、私はBBCニュースiOSのようなニュースリーダーアプリを開発しています。 BBCニュースで見る

私のアプリでは、ユーザーが読みたいニュースを簡単に選択できるように、サーバーから画像をダウンロードして表示する必要があります。

パフォーマンスを向上させるには、サーバーのイメージの再読み込みを回避するためにイメージをキャッシュする必要があります。キャッシュには2種類あることを知っています。メモリ(RAM)に画像を保存するメモリ内キャッシュと、必要なときに画像をディスクに保存してロードするDiskCachです。

私の質問は:私のアプリに最適な画像キャッシュ混合戦略は何ですか?(メモリ内キャッシュと画像キャッシュの両方を使用)私の解決策は次のとおりです。

  • 画像のダウンロード->ディスクキャッシュに保存+メモリキャッシュに保存->オンデマンドでメモリ内キャッシュから画像をロードしてビューに表示--->MAX_SIZEを超えるメモリ内キャッシュ->メモリ内キャッシュを解放--->オンデマンドでディスクキャッシュからイメージをロードし、メモリキャッシュに保存します->繰り返し.......。

私の解決策は正しいアプローチですか?

別の質問:メモリ内のキャッシュがMAX_SIZEを超えると、->キャッシュ内のすべての画像が失われるため、ビュー内の画像が消えます。->この問題を解決する方法は?

英語が下手でごめんなさい。少し早いですがお礼を。

4

1 に答える 1

3

私のプロジェクトの1つでは、ほぼ同じキャッシュ方法(ディスクキャッシュとメモリキャッシュ)を実装しました。

最大キャッシュサイズ

各キャッシュシステムには、独自の最大サイズ制限がありました。各画像の「サイズ」は、キャッシュシステムで異なる方法で計算されました。

メモリキャッシュの場合、各画像のサイズは image size = image width * image height (in pixels) Soとして計算されます。したがって、メモリキャッシュの最大サイズは、ピクセルサーフェスの最大領域を表します。

ディスクキャッシュには、各ファイルの実際のファイルサイズを使用しました。

部屋を作る

キャッシュシステムを使用すると、キャッシュの1つがいっぱいになり、新しいアイテムを挿入したい場合があります。スペースを空けるために、いくつかのアイテムを削除する必要があります。

私がしたことは、キャッシュ内の各エントリにタイムスタンプを割り当てることでした。そのアイテムにアクセスするたびに、タイムスタンプを更新しました。スペースを確保したい場合は、最後のアクセスタイムスタンプに基づいて、最も古いものから最も新しいものへのアイテムの削除を開始する必要があります。

これはスペースを解放するための単純なアルゴリズムであり、場合によっては実際には動作が悪い可能性があります。これよりも高度なものが必要かどうかを実験して確認するのはあなた次第です。たとえば、各アイテムに優先度の値を追加し、優先度が高い場合は古いアイテムをキャッシュに保持することで、この方法を改善できます。繰り返しますが、それはアプリのニーズによって異なります。

有効期限

ディスクキャッシュについては、エントリごとに有効期限を確実に追加します。ユーザーがアプリを完全に終了したときにメモリキャッシュが破壊された場合、ディスクキャッシュ内の画像が永久にそこにとどまる可能性があります。

カプセル化

私が考えるもう1つの側面は、キャッシングシステムをプログラマーに対して可能な限り透過的にすることです。キャッシュの1つを有効/無効にする場合は、ほとんどのコードを同じままにしておくのが最適です。

私のアプリでは、中央のコンテンツ配信システムを構築し、常にこのオブジェクトを介してインターネットから画像をリクエストしていました。次に、キャッシュシステムはローカルキャッシュ(メモリ/ディスク)をチェックし、イメージをすぐに返すか、ダウンロードを要求します。

いずれにせよ...私は、キャッシングシステムの「ユーザー」として、カーテンの後ろで何が起こっているのか気にしませんでした。私が知っていたのは、URLから画像を取得するように要求し、それを取得したことだけです(画像がキャッシュされているかどうかによって、高速または低速になります)。

于 2013-05-23T10:17:12.557 に答える