Disk Cache(ディスクキャッシュ)とは?iOSのディスクキャッシュと動作原理

著者: IT Sectr 公開日: 2026-07-11 読了時間: 7 分

Disk Cache(ディスクキャッシュ)は、デバイスのディスクにデータを一時的に保存する仕組みであり、iOSアプリケーションが以前に読み込んだリソースへの繰り返しアクセスを高速化します。Apple Developer Documentation, 2024によると、Disk Cacheはネットワーク使用量を減らし、バッテリー負荷を軽減し、オフラインモードでのアプリ動作を可能にします。iOSにはいくつかの組み込みキャッシュメカニズムがあります:ネットワークリクエスト用のURLCache、RAM用のNSCache、そしてCachesディレクトリを通じたカスタム実装です。

主要ポイント

  • Disk Cache — 繰り返しアクセスを高速化しトラフィックを削減するためのディスク上のデータ保存
  • URLCache — iOSのHTTPリクエスト用組み込みキャッシュメカニズム
  • Cachesディレクトリ — アプリの一時データ専用のSandboxディレクトリ
  • キャッシュの無効化はデータの鮮度にとって重要 — 時間ベース、イベントベース、バージョンベースの戦略
  • システムはディスク容量不足時にキャッシュを削除する可能性がある — キャッシュに復元不可能なデータを含めるべきではない

iOSにおけるDisk Cacheとは?

Disk Cacheは、デバイスの永続ストレージ(フラッシュメモリ)にデータを一時的に保存し、同じデータへの後続リクエストを高速化する技術です。RAMキャッシュとは異なり、Disk Cacheはアプリやデバイスの再起動後もデータを保持します。

iOSには揮発性(NSCache、メモリ)とディスクベース(URLCache、ファイルシステム)の2つの主要なキャッシュレベルがあります。ディスクキャッシュは揮発性キャッシュより10〜100倍遅いですが、ネットワークリクエストよりは大幅に高速です — その差は2〜3桁にもなります。最適な戦略は2レベルのキャッシュを使用することです:ホットデータにはメモリ、コールドデータにはディスクです。

Apple Performance Optimization Guide, 2023によると、適切に設定されたDisk Cacheは、繰り返し表示の場合のコンテンツ読み込み時間を60〜80%短縮し、トラフィック消費を40〜70%削減します。メディアリッチなアプリケーション(画像、動画、音声)にとって、キャッシュは重要なUX要素です。

URLCache:組み込みキャッシュメカニズム

URLCacheは、URLSessionリクエスト用の複合キャッシュを実装する組み込みのFoundationクラスです。Cache-Control、Expires、ETagなどのHTTPヘッダーに基づいてキャッシュサイズと無効化ポリシーを管理しながら、サーバー応答を自動的にディスクとメモリに保存します。

swift
import Foundation

let cache = URLCache(
    memoryCapacity: 50 * 1024 * 1024,
    diskCapacity: 200 * 1024 * 1024,
    diskPath: "network-cache"
)

URLCache.shared = cache

let config = URLSessionConfiguration.default
config.urlCache = cache
config.requestCachePolicy = .returnCacheDataElseLoad

let session = URLSession(configuration: config)

URLCacheのキャッシュポリシーは、キャッシュデータを使用するタイミングと新しいリクエストを実行するタイミングを決定します。主なポリシーには以下が含まれます:useProtocolCachePolicy(サーバーヘッダーに基づく)、reloadIgnoringLocalCacheData(常にサーバーから)、returnCacheDataElseLoad(キャッシュ優先)、returnCacheDataDontLoad(キャッシュのみ — オフラインモード)。

Cache-Controlは、サーバーが応答とともに送信するHTTPヘッダーで、max-age(有効期間(秒))、must-revalidate(鮮度の確認)、no-cache(確認なしでの使用禁止)、no-store(キャッシュ禁止)を指定します。iOSはuseProtocolCachePolicyポリシーでURLCacheを使用する際、これらのヘッダーを自動的に厳守します。

カスタムキャッシュ戦略と無効化

カスタムキャッシュは、組み込みのURLCacheが不十分な場合に必要です — 処理済み画像、シリアル化されたデータモデル、計算結果の保存などです。このような場合、開発者はアプリのSandbox内のCachesディレクトリに基づいて独自のキャッシュシステムを構築します。

swift
class DiskCache<T: Codable> {
    private let cacheDir: URL
    private let encoder = JSONEncoder()
    private let decoder = JSONDecoder()

    init() {
        let paths = FileManager.default
            .urls(for: .cachesDirectory,
                     in: .userDomainMask)
        cacheDir = paths[0].appendingPathComponent(
            "data-cache", isDirectory: true
        )
        try? FileManager.default
            .createDirectory(at: cacheDir,
                             withIntermediateDirectories: true)
    }

    func set(value: T, for key: String) {
        let url = cacheDir.appendingPathComponent(
            SHA256.hash(key)
        )
        if let data = try? encoder.encode(value) {
            try? data.write(to: url)
        }
    }

    func get(for key: String) -> T? {
        let url = cacheDir.appendingPathComponent(
            SHA256.hash(key)
        )
        guard let data = try? Data(contentsOf: url) else { return nil }
        return try? decoder.decode(T.self, from: data)
    }

    func clearAll() {
        try? FileManager.default
            .removeItem(at: cacheDir)
    }
}

キャッシュ無効化戦略は、保存されたデータがいつ古くなったと見なされるかを決定します:TTL(Time-To-Live) — 書き込み後一定期間データが有効;イベント駆動 — イベント(例:サーバー上のデータ更新)に基づく無効化;バージョンベース — APIバージョンやデータ形式の変更時に無効化;LRU(Least Recently Used) — サイズ制限を超えた場合に最も使用されていないエントリを自動削除。

実践的なルール:TTLはニュースや予測可能に古くなるコンテンツに適しています。イベント駆動はプッシュ通知を介したサーバー管理データに適しています。バージョンベースは設定やデータモデルキャッシュに適しています。LRUはディスク容量が限られたメディアファイルの汎用的な選択肢です。

キャッシュのパフォーマンスと制限

Disk Cacheのパフォーマンスはヒット率(hit ratio)で測定されます — ネットワーク呼び出しなしでキャッシュから満たされたリクエストの割合です。適切に設定された画像キャッシュの一般的なヒット率は70〜90%、API応答は40〜60%、ストリーミング動画は30〜50%です。

データタイプ一般的なヒット率推奨キャッシュサイズ
画像70〜90%100〜500 MB
API JSON応答40〜60%10〜50 MB
動画/音声30〜50%500 MB — 1 GB
フォントとリソース90〜99%5〜20 MB
Webコンテンツ50〜70%50〜200 MB

iOSにおけるDisk Cacheの制限:システムはディスク容量が不足した場合、いつでもCachesディレクトリの内容を削除する可能性があります。この動作は設定できません — iOSがいつどのキャッシュファイルを削除するかを決定します。したがって、キャッシュにはネットワークや他のソースから復元できないデータを含めるべきではありません。

フラッシュメモリへの影響:Disk Cacheへの頻繁な書き込みはフラッシュストレージの消耗を早めます。iOSはTRIMとウェアレベリングを使用して消耗を最小限に抑えますが、開発者は過剰な書き込みを避けることが推奨されます:同じファイルのキャッシュを5分に1回以上更新しない;小さな書き込みをまとめる;ディスクに永続化する必要のない一時データにはNSCacheを使用する。

iOSでのキャッシュのベストプラクティス

2レベルのキャッシュはiOSアプリの標準アーキテクチャです:頻繁にアクセスされるデータにはメモリ(NSCache)、セッション間で保持すべきデータにはディスク(URLCacheまたはカスタム)を使用します。メモリ内の有効期間は数分、ディスク上では数時間または数日です。

画像キャッシュ:自動無効化、メモリ管理、非同期ディスク書き込みを備えた2レベルキャッシュを実装する専門ライブラリ(Kingfisher、SDWebImage、Nuke)を使用します。カスタム画像キャッシュの実装には、デコード、色空間、スケーリングの考慮が必要です。

キャッシュとセキュリティ:機密データ(パスワード、トークン、個人データ)を暗号化なしでディスクにキャッシュしないでください。URLCacheはデフォルトでデータを暗号化しません — 機密コンテンツにはNSFileProtectionまたはアプリケーションレベルの暗号化を使用してください。認証が必要なネットワークリクエストには.reloadIgnoringLocalCacheDataポリシーを使用します。

キャッシュ監視:ヒット率、現在のキャッシュサイズ、1分あたりの書き込み数を追跡します。ヒット率が30%を下回った場合、キャッシュは非効率であり、戦略の見直しまたはサイズの増加が必要です。Point-Free (2024)によると、キャッシュ監視はiOSアプリのパフォーマンス最適化において最も過小評価されているプラクティスの1つです。

よくある質問

iOSにおけるDisk Cacheとは?

Disk Cacheは、繰り返しアクセスを高速化するためにデバイスのディスクにデータを保存する技術です。iOSの組み込みURLCacheはHTTP応答をキャッシュし、開発者はCachesディレクトリを通じてカスタムキャッシュを作成できます。

Disk CacheとRAM Cacheの違いは?

RAM Cache(NSCache)はデータをRAMに保存します — 高速ですが、アプリ再起動時に失われます。Disk Cacheは低速ですが、セッション間で保持されます。最適な戦略は両方のレベルを使用します:ホットデータにはメモリ、コールドデータにはディスクです。

iOSはキャッシュを削除できますか?

はい、システムはディスク容量が不足した場合、いつでもCachesディレクトリの内容を削除できます。したがって、復元不可能なデータをキャッシュに保存しないでください。ユーザードキュメントにはDocumentsディレクトリを使用してください。

適切なキャッシュサイズの選び方は?

キャッシュサイズはデータタイプによって異なります:画像には100〜500 MB、API応答には10〜50 MB、動画には最大1 GBです。ヒット率を監視してください — 50%を下回った場合、キャッシュサイズを増やすか、無効化戦略を変更してください。

iOSアプリでキャッシュをクリアする方法は?

URLCache.removeAllCachedResponses()で組み込みキャッシュをクリアします。カスタムキャッシュの場合は、FileManagerを介してCachesディレクトリからファイルを削除します。アプリ設定でキャッシュをクリアするオプションを常にユーザーに提供してください。

まとめ

  • Disk Cache — 高速な繰り返しアクセスとトラフィック削減のためのディスク上の一時データ保存
  • URLCache — Cache-Control対応の組み込みFoundation HTTPリクエストキャッシュ
  • Cachesディレクトリ — 一時データ用のSandboxディレクトリ、容量不足時にシステムがクリア
  • 無効化はTTL、イベント、バージョン、LRUによって実行 — 選択はデータタイプに依存
  • ヒット率 — 主要なキャッシュ効率指標:画像70%以上、API 40〜60%
  • 2レベルキャッシュ(RAM + ディスク) — iOSアプリの標準アーキテクチャ
  • セキュリティ — 機密データは暗号化なしにディスクにキャッシュすべきではない

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください