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 directory — специальная директория 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) — данные живут фиксированное время после записи; event-driven — инвалидация по наступлению события (например, обновление данных на сервере); version-based — инвалидация при изменении версии API или формата данных; LRU (Least Recently Used) — автоматическое удаление наименее используемых записей при превышении лимита размера.

Практическое правило: TTL подходит для новостей и контента, который устаревает предсказуемо. Event-driven — для данных, управляемых сервером через push-уведомления. Version-based — для конфигураций и кэша моделей данных. LRU — универсальный выбор для медиафайлов с ограниченным дисковым пространством.

Производительность и ограничения кэша

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

Тип данныхТипичный hit ratioРекомендуемый размер кэша
Изображения70–90%100–500 МБ
API-ответы JSON40–60%10–50 МБ
Видео/аудио30–50%500 МБ — 1 ГБ
Шрифты и ресурсы90–99%5–20 МБ
Web-контент50–70%50–200 МБ

Ограничения Disk Cache в iOS: система может удалить содержимое директории Caches в любой момент при нехватке места на диске. Это поведение не настраивается — iOS сама решает, когда и какие кэшированные файлы удалить. Поэтому кэш не должен содержать данные, которые невозможно восстановить из сети или других источников.

Влияние на Flash-память: частая запись в 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 — технология хранения данных на диске устройства для ускорения повторного доступа. В iOS встроенный URLCache кэширует HTTP-ответы, а разработчики могут создавать кастомные кэши через директорию Caches.

Чем Disk Cache отличается от RAM Cache?

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

Может ли iOS удалить мой кэш?

Да, система может удалить содержимое директории Caches в любой момент при нехватке места. Поэтому никогда не храните в кэше данные, которые невозможно восстановить. Для пользовательских документов используйте директорию Documents.

Как выбрать правильный размер кэша?

Размер кэша зависит от типа данных: для изображений 100–500 МБ, для API-ответов 10–50 МБ, для видео до 1 ГБ. Отслеживайте hit ratio — если он падает ниже 50%, увеличьте размер кэша или измените стратегию инвалидации.

Как очистить кэш в iOS приложении?

URLCache.removeAllCachedResponses() очищает встроенный кэш. Для кастомного кэша удалите файлы из директории Caches через FileManager. Всегда предоставляйте пользователю возможность очистить кэш через настройки приложения.

Итоги

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

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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