Instagramフィード(画像といくつかのラベルを含むセルを含むテーブルビュー)に似たアプリを開発しています。
データベースから取得するすべてのデータに対して、データタスクを使用しています(データを受信するのにそれほど時間がかからないため)が、画像(データリクエストで取得するURL)については、次のことを行う必要があります。将来の使用のためにローカルに保存します(ユーザーエクスペリエンスを向上させます)。
私のロジックは次のとおりです。NSCacheまたはドキュメントディレクトリに、ダウンロードした日付のフォルダ内の画像を保存します(一度作成し、必要に応じて他のすべての画像を追加します)(削除します最近の7日間)以外のすべてのフォルダー、およびTableViewの場合は、そこからロードするだけなので、テーブルビューはスムーズにスクロールし、デリゲートから直接URLをロードしません方法。だから、私のニーズに応じてそれらを保存するのに適した場所はどこですか、NSCacheまたはドキュメントディレクトリ。
あなたの提案を聞くのを楽しみにしています、ありがとう!
NSCache
と永続ストレージは大きく異なる目的を果たします。 NSCache
はアイテムをメモリに保持し、最適なパフォーマンスのために使用されます。ただし、メモリ(RAM)を消費するため、NSCache
を使用する場合は、メモリの警告に応答し、その場合はNSCache
を削除する必要があります。また、アプリが終了すると、NSCache
は失われます。
永続ストレージキャッシュ(通常はCaches
フォルダー)の使用は別の目的で使用されるため、ネットワークリクエストを介してアセットを再取得する必要がなくなりますが、リソースはメモリに保持されません。これにより、アプリを実行しているセッション間、またはメモリ不足に遭遇し、NSCache
を削除したが、ネットワークからアセットを再取得したくない状況で、優れたキャッシュメカニズムになります。
永続ストレージ用のCaches
フォルダーについて言及しているのに対し、Documents
フォルダーを使用すると思われるかもしれませんが、2つの考慮事項があります。
Appleは、簡単に再作成できないユーザーデータにはDocuments
フォルダーのみを使用し、簡単に再取得できるデータにはCaches
フォルダーを使用するアプリにさらにこだわりを持っています。詳細については、 ファイルシステムの基本 を参照してください。
IOS 11以降では、ユーザーに表示されるドキュメントのみをDocuments
フォルダーに保存する必要があります(WWDC 2017秋のビデオ iOSストレージのベストプラクティス を参照)。簡単に再構築できないファイルを内部で使用した場合でも、最終的にユーザーをそれらに公開することを意図していない限り、Documents
フォルダーではなくApplication Support
ディレクトリを使用します。
結論として、永続ストレージベースのキャッシュには通常Caches
フォルダーを使用します。
多くの場合、2層のキャッシュメカニズムを使用することに注意してください。リソースをbothNSCache
フォルダーとCaches
フォルダーの両方にキャッシュします。次に、リソースを取得するときに、最初にNSCache
(非常に高速)を確認し、存在しない場合は永続ストレージを確認し、存在しない場合はネットワークからアセットを再取得します。
とはいえ、さらに複雑にするために、NSURLCache
によって提供される3番目のタイプのキャッシュがあります(つまり、ネットワーク要求への応答はNSURLSession
とNSURLConnection
)。このキャッシュは、十分に文書化されていないルールによって決定され(たとえば、サイズが合計キャッシュサイズの5%を超える単一のアイテムをキャッシュしません)、ネットワーク応答によって提供されるHTTPヘッダーの影響を受けます。ただし、このキャッシュはほぼ透過的に動作し、メモリキャッシュと永続ストレージキャッシュの両方を提供します。多くの場合、ユーザーの介入なしでNSURLCache
キャッシュ動作を楽しむことができます。それはシームレスです(それが機能するとき)。