Disk Cache: що це, дисковий кеш iOS і принципи роботи

Автор: IT Sectr Опубліковано: 2026-07-11 Час читання: 7 хв

Disk Cache — це механізм тимчасового зберігання даних на диску пристрою, який дозволяє додаткам iOS прискорювати повторний доступ до раніше завантажених ресурсів. Згідно з Apple Developer Documentation, 2024, Disk Cache зменшує використання мережі, знижує навантаження на батарею та забезпечує роботу додатка в офлайн-режимі. iOS надає кілька вбудованих механізмів кешування: URLCache для мережевих запитів, NSCache для оперативної пам’яті та кастомні реалізації через директорію Caches.

Головне

  • Disk Cache — зберігання даних на диску для прискорення повторного доступу та зниження трафіку
  • URLCache — вбудований механізм кешування HTTP-запитів в iOS
  • Директорія Caches — спеціальна директорія Sandbox для тимчасових даних додатка
  • Інвалідація кешу критична для актуальності даних — стратегії за часом, подією та версією
  • Система може очистити кеш при нестачі місця — кеш не повинен містити незамінні дані

Що таке Disk Cache в iOS?

Disk Cache — це технологія тимчасового зберігання даних на постійному носії пристрою (флеш-пам’яті) для прискорення подальших запитів до тих самих даних. На відміну від RAM-кешу, Disk Cache зберігає дані після перезапуску додатка та навіть пристрою.

iOS надає два основні рівні кешування: енергозалежний (NSCache, пам’ять) та дисковий (URLCache, файлова система). Дисковий кеш у 10–100 разів повільніший за енергозалежний, але значно швидший за мережевий запит — різниця може становити від 2 до 3 порядків. Оптимальна стратегія використовує дворівневий кеш: пам’ять для гарячих даних і диск для холодних.

За даними Apple Performance Optimization Guide, 2023, правильно налаштований Disk Cache скорочує час завантаження контенту на 60–80% для повторних переглядів і зменшує витрати трафіку на 40–70%. Для додатків із медіаконтентом (зображення, відео, аудіо) кешування є критичним фактором UX.

URLCache: вбудований механізм кешування

URLCache — це вбудований клас Foundation, який реалізує комбінований кеш для запитів URLSession. Він автоматично зберігає відповіді сервера на диск і в пам’ять, керуючи розміром кешу та політиками інвалідації на основі HTTP-заголовків Cache-Control, Expires та ETag.

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 суворо дотримується цих заголовків автоматично при використанні URLCache з політикою useProtocolCachePolicy.

Кастомні стратегії кешування та інвалідація

Кастомний кеш необхідний, коли вбудованого URLCache недостатньо — для зберігання оброблених зображень, серіалізованих моделей даних або результатів обчислень. У таких випадках розробники створюють власну систему кешування на основі директорії Caches у Sandbox додатка.

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 підходить для новин і контенту, який застаріває передбачувано. Подієво-орієнтована — для даних, керованих сервером через push-сповіщення. Версійно-орієнтована — для конфігурацій і кешу моделей даних. LRU — універсальний вибір для медіафайлів з обмеженим дисковим простором.

Продуктивність та обмеження кешу

Продуктивність Disk Cache вимірюється через hit ratio — відсоток запитів, задоволених з кешу без звернення до мережі. Типовий hit ratio для добре налаштованого кешу зображень становить 70–90%, для API-відповідей — 40–60%, для потокового відео — 30–50%.

Тип данихТиповий hit ratioРекомендований розмір кешу
Зображення70–90%100–500 MB
API JSON відповіді40–60%10–50 MB
Відео/Аудіо30–50%500 MB — 1 GB
Шрифти та ресурси90–99%5–20 MB
Веб-контент50–70%50–200 MB

Обмеження Disk Cache в iOS: система може видалити вміст директорії Caches у будь-який момент при нестачі місця на диску. Ця поведінка не налаштовується — iOS сама вирішує, коли і які кешовані файли видалити. Тому кеш не повинен містити дані, які неможливо відновити з мережі або інших джерел.

Вплив на флеш-пам’ять: часте записування в Disk Cache прискорює знос флеш-накопичувача. iOS використовує TRIM та wear leveling для мінімізації зносу, але розробникам рекомендується уникати надмірного запису: не оновлювати кеш частіше, ніж раз на 5 хвилин для одного файлу; групувати дрібні записи; використовувати NSCache для тимчасових даних, які не потрібно зберігати на диску.

Найкращі практики кешування в iOS

Дворівневий кеш — стандартна архітектура для iOS-додатків: пам’ять (NSCache) для даних, до яких звертаються часто, і диск (URLCache або кастомний) для даних, які повинні зберігатися між сесіями. Час життя в пам’яті — хвилини, на диску — години або дні.

Кешування зображень: використовуйте спеціалізовані бібліотеки (Kingfisher, SDWebImage, Nuke), які реалізують дворівневий кеш з автоматичною інвалідацією, обробкою пам’яті та асинхронним записом на диск. Самостійна реалізація кешу зображень вимагає врахування декодування, колірного простору та масштабування.

Кеш та безпека: не кешуйте конфіденційні дані (паролі, токени, персональні дані) на диск без шифрування. URLCache за замовчуванням не шифрує дані — використовуйте NSFileProtection або шифрування на рівні додатка для чутливого контенту. Для авторизованих мережевих запитів використовуйте політику .reloadIgnoringLocalCacheData.

Моніторинг кешу: відстежуйте hit ratio, поточний розмір кешу та кількість записів на хвилину. Якщо hit ratio падає нижче 30%, кеш неефективний і потребує перегляду стратегії або збільшення розміру. За даними Point-Free (2024), моніторинг кешу — одна з найбільш недооцінених практик оптимізації продуктивності iOS-додатків.

Часті запитання

Що таке Disk Cache в iOS?

Disk Cache — технологія зберігання даних на диску пристрою для прискорення повторного доступу. Вбудований URLCache в iOS кешує HTTP-відповіді, а розробники можуть створювати кастомні кеші через директорію Caches.

Чим Disk Cache відрізняється від RAM Cache?

RAM Cache (NSCache) зберігає дані в оперативній пам’яті — швидше, але втрачається при перезапуску додатка. Disk Cache повільніший, але зберігається між сесіями. Оптимальна стратегія використовує обидва рівні: пам’ять для гарячих даних, диск для холодних.

Чи може iOS видалити мій кеш?

Так, система може видалити вміст директорії Caches у будь-який момент при нестачі місця. Тому ніколи не зберігайте в кеші дані, які неможливо відновити. Для користувацьких документів використовуйте директорію Documents.

Як вибрати правильний розмір кешу?

Розмір кешу залежить від типу даних: для зображень 100–500 MB, для API-відповідей 10–50 MB, для відео до 1 GB. Відстежуйте hit ratio — якщо він падає нижче 50%, збільште розмір кешу або змініть стратегію інвалідації.

Як очистити кеш у додатку iOS?

URLCache.removeAllCachedResponses() очищує вбудований кеш. Для кастомного кешу видаліть файли з директорії Caches через FileManager. Завжди надавайте користувачам можливість очистити кеш через налаштування додатка.

Підсумки

  • Disk Cache — тимчасове зберігання даних на диску для прискорення повторного доступу та зниження трафіку
  • URLCache — вбудований механізм кешування HTTP-запитів Foundation з підтримкою Cache-Control
  • Директорія Caches — Sandbox-директорія для тимчасових даних, очищувана системою при нестачі місця
  • Інвалідація виконується за TTL, подією, версією або LRU — вибір залежить від типу даних
  • Hit ratio — ключова метрика ефективності кешу: 70%+ для зображень, 40–60% для API
  • Дворівневий кеш (RAM + Disk) — стандартна архітектура для iOS-додатків
  • Безпека — конфіденційні дані не повинні кешуватися на диск без шифрування

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також