web-dev-qa-db-ja.com

iOS-画像をローカルに保存するためのベストプラクティス-NSCacheとドキュメントディレクトリに保存

Instagramフィード(画像といくつかのラベルを含むセルを含むテーブルビュー)に似たアプリを開発しています。

データベースから取得するすべてのデータに対して、データタスクを使用しています(データを受信するのにそれほど時間がかからないため)が、画像(データリクエストで取得するURL)については、次のことを行う必要があります。将来の使用のためにローカルに保存します(ユーザーエクスペリエンスを向上させます)。

私のロジックは次のとおりです。NSCacheまたはドキュメントディレクトリに、ダウンロードした日付のフォルダ内の画像を保存します(一度作成し、必要に応じて他のすべての画像を追加します)(削除します最近の7日間)以外のすべてのフォルダー、およびTableViewの場合は、そこからロードするだけなので、テーブルビューはスムーズにスクロールし、デリゲートから直接URLをロードしません方法。だから、私のニーズに応じてそれらを保存するのに適した場所はどこですか、NSCacheまたはドキュメントディレクトリ

あなたの提案を聞くのを楽しみにしています、ありがとう!

15
Jackky White

NSCacheと永続ストレージは大きく異なる目的を果たします。 NSCacheはアイテムをメモリに保持し、最適なパフォーマンスのために使用されます。ただし、メモリ(RAM)を消費するため、NSCacheを使用する場合は、メモリの警告に応答し、その場合はNSCacheを削除する必要があります。また、アプリが終了すると、NSCacheは失われます。

永続ストレージキャッシュ(通常はCachesフォルダー)の使用は別の目的で使用されるため、ネットワークリクエストを介してアセットを再取得する必要がなくなりますが、リソースはメモリに保持されません。これにより、アプリを実行しているセッション間、またはメモリ不足に遭遇し、NSCacheを削除したが、ネットワークからアセットを再取得したくない状況で、優れたキャッシュメカニズムになります。

永続ストレージ用のCachesフォルダーについて言及しているのに対し、Documentsフォルダーを使用すると思われるかもしれませんが、2つの考慮事項があります。

  1. Appleは、簡単に再作成できないユーザーデータにはDocumentsフォルダーのみを使用し、簡単に再取得できるデータにはCachesフォルダーを使用するアプリにさらにこだわりを持っています。詳細については、 ファイルシステムの基本 を参照してください。

  2. IOS 11以降では、ユーザーに表示されるドキュメントのみをDocumentsフォルダーに保存する必要があります(WWDC 2017秋のビデオ iOSストレージのベストプラクティス を参照)。簡単に再構築できないファイルを内部で使用した場合でも、最終的にユーザーをそれらに公開することを意図していない限り、DocumentsフォルダーではなくApplication Supportディレクトリを使用します。

結論として、永続ストレージベースのキャッシュには通常Cachesフォルダーを使用します。

多くの場合、2層のキャッシュメカニズムを使用することに注意してください。リソースをbothNSCacheフォルダーとCachesフォルダーの両方にキャッシュします。次に、リソースを取得するときに、最初にNSCache(非常に高速)を確認し、存在しない場合は永続ストレージを確認し、存在しない場合はネットワークからアセットを再取得します。

とはいえ、さらに複雑にするために、NSURLCacheによって提供される3番目のタイプのキャッシュがあります(つまり、ネットワーク要求への応答はNSURLSessionNSURLConnection)。このキャッシュは、十分に文書化されていないルールによって決定され(たとえば、サイズが合計キャッシュサイズの5%を超える単一のアイテムをキャッシュしません)、ネットワーク応答によって提供されるHTTPヘッダーの影響を受けます。ただし、このキャッシュはほぼ透過的に動作し、メモリキャッシュと永続ストレージキャッシュの両方を提供します。多くの場合、ユーザーの介入なしでNSURLCacheキャッシュ動作を楽しむことができます。それはシームレスです(それが機能するとき)。

39
Rob