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 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 минута за исти фајл; груписати мале уписe у један; користити 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 MB, за API одговоре 10–50 MB, за видео до 1 GB. Пратите hit ratio — ако падне испод 50%, повећајте величину кеша или промените стратегију инвалидације.
URLCache.removeAllCachedResponses() брише уграђени кеш. За прилагођени кеш, обришите датотеке из директоријума Caches путем FileManager-а. Увек пружите кориснику могућност да обрише кеш у подешавањима апликације.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође