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) — дані живуть фіксований час після запису; подієво-орієнтована — інвалідація на основі події (наприклад, оновлення даних на сервері); версійно-орієнтована — інвалідація при зміні версії 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-додатків: пам’ять (NSCache) для даних, до яких звертаються часто, і диск (URLCache або кастомний) для даних, які повинні зберігатися між сесіями. Час життя в пам’яті — хвилини, на диску — години або дні.
Кешування зображень: використовуйте спеціалізовані бібліотеки (Kingfisher, SDWebImage, Nuke), які реалізують дворівневий кеш з автоматичною інвалідацією, обробкою пам’яті та асинхронним записом на диск. Самостійна реалізація кешу зображень вимагає врахування декодування, колірного простору та масштабування.
Кеш та безпека: не кешуйте конфіденційні дані (паролі, токени, персональні дані) на диск без шифрування. URLCache за замовчуванням не шифрує дані — використовуйте NSFileProtection або шифрування на рівні додатка для чутливого контенту. Для авторизованих мережевих запитів використовуйте політику .reloadIgnoringLocalCacheData.
Моніторинг кешу: відстежуйте hit ratio, поточний розмір кешу та кількість записів на хвилину. Якщо hit ratio падає нижче 30%, кеш неефективний і потребує перегляду стратегії або збільшення розміру. За даними Point-Free (2024), моніторинг кешу — одна з найбільш недооцінених практик оптимізації продуктивності iOS-додатків.
Часті запитання
Disk Cache — технологія зберігання даних на диску пристрою для прискорення повторного доступу. Вбудований URLCache в iOS кешує HTTP-відповіді, а розробники можуть створювати кастомні кеші через директорію Caches.
RAM Cache (NSCache) зберігає дані в оперативній пам’яті — швидше, але втрачається при перезапуску додатка. Disk Cache повільніший, але зберігається між сесіями. Оптимальна стратегія використовує обидва рівні: пам’ять для гарячих даних, диск для холодних.
Так, система може видалити вміст директорії Caches у будь-який момент при нестачі місця. Тому ніколи не зберігайте в кеші дані, які неможливо відновити. Для користувацьких документів використовуйте директорію Documents.
Розмір кешу залежить від типу даних: для зображень 100–500 MB, для API-відповідей 10–50 MB, для відео до 1 GB. Відстежуйте hit ratio — якщо він падає нижче 50%, збільште розмір кешу або змініть стратегію інвалідації.
URLCache.removeAllCachedResponses() очищує вбудований кеш. Для кастомного кешу видаліть файли з директорії Caches через FileManager. Завжди надавайте користувачам можливість очистити кеш через налаштування додатка.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також