Disk Cache — это механизм временного хранения данных на диске устройства, позволяющий приложениям iOS ускорять повторный доступ к ранее загруженным ресурсам. По данным Apple Developer Documentation, 2024, Disk Cache уменьшает использование сети, снижает нагрузку на батарею и обеспечивает работу приложения в офлайн-режиме. iOS предоставляет несколько встроенных механизмов кэширования: URLCache для сетевых запросов, NSCache для оперативной памяти и кастомные реализации через директорию Caches.
Главное
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 — это встроенный класс Foundation, реализующий комбинированный кэш для запросов URLSession. Он автоматически сохраняет ответы сервера на диск и в память, управляя размером кэша и политиками инвалидации на основе HTTP-заголовков Cache-Control, Expires и ETag.
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 приложения.
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-ответы JSON | 40–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-приложений: память (NSCache) для данных, к которым обращаются часто, и диск (URLCache или кастомный) для данных, которые должны сохраняться между сессиями. Время жизни в памяти — минуты, на диске — часы или дни.
Кэширование изображений: используйте специализированные библиотеки (Kingfisher, SDWebImage, Nuke),которые реализуют двухуровневый кэш с автоматической инвалидацией, обработкой памяти и асинхронной записью на диск. Самостоятельная реализация кэша изображений требует учёта декодирования, цветового пространства и масштабирования.
Кэш и безопасность: не кэшируйте конфиденциальные данные (пароли, токены, персональные данные) на диск без шифрования. URLCache по умолчанию не шифрует данные — используйте NSFileProtection или шифрование на уровне приложения для чувствительного контента. Для сетевых запросов с авторизацией используйте политику .reloadIgnoringLocalCacheData.
Мониторинг кэша: отслеживайте hit ratio, текущий размер кэша и количество записей в минуту. Если hit ratio падает ниже 30% — значит, кэш неэффективен и требует пересмотра стратегии или увеличения размера. По данным Point-Free (2024), мониторинг кэша — одна из наиболее недооценённых практик оптимизации производительности iOS-приложений.
Часто задаваемые вопросы
Disk Cache — технология хранения данных на диске устройства для ускорения повторного доступа. В iOS встроенный URLCache кэширует HTTP-ответы, а разработчики могут создавать кастомные кэши через директорию Caches.
RAM Cache (NSCache) хранит данные в оперативной памяти — быстрее, но теряется при перезапуске приложения. Disk Cache медленнее, но сохраняется между сессиями. Оптимальная стратегия использует оба уровня: память для горячих данных, диск для холодных.
Да, система может удалить содержимое директории Caches в любой момент при нехватке места. Поэтому никогда не храните в кэше данные, которые невозможно восстановить. Для пользовательских документов используйте директорию Documents.
Размер кэша зависит от типа данных: для изображений 100–500 МБ, для API-ответов 10–50 МБ, для видео до 1 ГБ. Отслеживайте hit ratio — если он падает ниже 50%, увеличьте размер кэша или измените стратегию инвалидации.
URLCache.removeAllCachedResponses() очищает встроенный кэш. Для кастомного кэша удалите файлы из директории Caches через FileManager. Всегда предоставляйте пользователю возможность очистить кэш через настройки приложения.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также