Disk Cache — este un mecanism de stocare temporară a datelor pe discul dispozitivului, permițând aplicațiilor iOS să accelereze accesul repetat la resursele încărcate anterior. Conform Apple Developer Documentation, 2024, Disk Cache reduce utilizarea rețelei, scade încărcarea bateriei și asigură funcționarea aplicației în modul offline. iOS oferă mai multe mecanisme integrate de cache: URLCache pentru cereri de rețea, NSCache pentru memoria RAM și implementări personalizate prin directorul Caches.
Principalele puncte
Disk Cache — este o tehnologie de stocare temporară a datelor pe suportul permanent al dispozitivului (memoria flash) pentru a accelera cererile ulterioare către aceleași date. Spre deosebire de cache-ul RAM, Disk Cache păstrează datele după repornirea aplicației și chiar a dispozitivului.
iOS oferă două niveluri principale de cache: operațional (NSCache, memorie) și pe disc (URLCache, sistem de fișiere). Cache-ul pe disc este de 10–100 de ori mai lent decât cel operațional, dar semnificativ mai rapid decât o cerere de rețea — diferența poate fi de 2 până la 3 ordine de mărime. Strategia optimă utilizează un cache pe două niveluri: memoria pentru datele fierbinți și discul pentru datele reci.
Conform Apple Performance Optimization Guide, 2023, un Disk Cache configurat corect reduce timpul de încărcare a conținutului cu 60–80% pentru vizualizări repetate și scade consumul de trafic cu 40–70%. Pentru aplicațiile cu conținut media (imagini, video, audio), cache-ul este un factor critic pentru UX.
URLCache — este o clasă integrată Foundation care implementează un cache combinat pentru cererile URLSession. Aceasta salvează automat răspunsurile serverului pe disc și în memorie, gestionând dimensiunea cache-ului și politicile de invalidare pe baza antetelor HTTP Cache-Control, Expires și 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)
Politicile de cache URLCache determină când să utilizeze datele din cache și când să execute o nouă cerere. Principalele politici: useProtocolCachePolicy (pe baza antetelor serverului), reloadIgnoringLocalCacheData (întotdeauna de la server), returnCacheDataElseLoad (mai întâi cache-ul), returnCacheDataDontLoad (doar cache-ul — modul offline).
Cache-Control — antetul HTTP pe care serverul îl trimite împreună cu răspunsul, indicând max-age (timpul de viață în secunde), must-revalidate (verificarea actualității), no-cache (nu utiliza fără verificare) și no-store (nu stoca în cache). iOS respectă strict aceste antete automat când utilizează URLCache cu politica useProtocolCachePolicy.
Cache-ul personalizat este necesar când URLCache integrat nu este suficient: pentru stocarea imaginilor procesate, modelelor de date serializate sau rezultatelor calculelor. În astfel de cazuri, dezvoltatorul își creează propriul sistem de cache bazat pe directorul Caches din Sandbox-ul aplicației.
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)
}
}
Strategiile de invalidare a cache-ului determină când datele stocate sunt considerate învechite: TTL (Time-To-Live) — datele trăiesc un timp fix după scriere; event-driven — invalidare la apariția unui eveniment (de exemplu, actualizarea datelor pe server); version-based — invalidare la schimbarea versiunii API sau a formatului datelor; LRU (Least Recently Used) — ștergerea automată a celor mai puțin utilizate înregistrări la depășirea limitei de dimensiune.
Regula practică: TTL este potrivit pentru știri și conținut care îmbătrânește previzibil. Event-driven — pentru date gestionate de server prin notificări push. Version-based — pentru configurații și cache-ul modelelor de date. LRU — alegere universală pentru fișiere media cu spațiu pe disc limitat.
Performanța Disk Cache se măsoară prin hit ratio — procentul cererilor satisfăcute din cache fără a accesa rețeaua. Hit ratio-ul tipic pentru un cache de imagini bine configurat este de 70–90%, pentru răspunsurile API — 40–60%, pentru video în flux — 30–50%.
| Tip de date | Hit ratio tipic | Dimensiune recomandată a cache-ului |
|---|---|---|
| Imagini | 70–90% | 100–500 MB |
| Răspunsuri API JSON | 40–60% | 10–50 MB |
| Video/audio | 30–50% | 500 MB — 1 GB |
| Fonturi și resurse | 90–99% | 5–20 MB |
| Conținut web | 50–70% | 50–200 MB |
Limitările Disk Cache în iOS: sistemul poate șterge conținutul directorului Caches în orice moment când spațiul pe disc este insuficient. Acest comportament nu poate fi configurat — iOS decide singur când și ce fișiere cache să șteargă. Prin urmare, cache-ul nu trebuie să conțină date care nu pot fi recuperate din rețea sau din alte surse.
Impactul asupra memoriei flash: scrierea frecventă în Disk Cache accelerează uzura memoriei flash. iOS utilizează TRIM și wear leveling pentru a minimiza uzura, dar dezvoltatorilor li se recomandă să evite scrierile excesive: să nu actualizeze cache-ul mai des decât o dată la 5 minute pentru același fișier; să grupeze scrierile mici într-una singură; să utilizeze NSCache pentru date temporare care nu trebuie stocate pe disc.
Cache-ul pe două niveluri — arhitectura standard pentru aplicațiile iOS: memoria (NSCache) pentru datele accesate frecvent și discul (URLCache sau personalizat) pentru datele care trebuie păstrate între sesiuni. Durata de viață în memorie — minute, pe disc — ore sau zile.
Cache-ul imaginilor: utilizați biblioteci specializate (Kingfisher, SDWebImage, Nuke), care implementează un cache pe două niveluri cu invalidare automată, gestionarea memoriei și scriere asincronă pe disc. Implementarea proprie a cache-ului de imagini necesită luarea în considerare a decodării, spațiului de culoare și scalării.
Cache-ul și securitatea: nu stocați în cache date confidențiale (parole, token-uri, date personale) pe disc fără criptare. URLCache implicit nu criptează datele — utilizați NSFileProtection sau criptarea la nivel de aplicație pentru conținut sensibil. Pentru cererile de rețea cu autentificare, utilizați politica .reloadIgnoringLocalCacheData.
Monitorizarea cache-ului: urmăriți hit ratio, dimensiunea curentă a cache-ului și numărul de scrieri pe minut. Dacă hit ratio scade sub 30% — cache-ul este ineficient și necesită revizuirea strategiei sau mărirea dimensiunii. Conform Point-Free (2024), monitorizarea cache-ului este una dintre cele mai subestimate practici de optimizare a performanței aplicațiilor iOS.
Întrebări frecvente
Disk Cache — tehnologie de stocare a datelor pe discul dispozitivului pentru a accelera accesul repetat. În iOS, URLCache integrat stochează în cache răspunsurile HTTP, iar dezvoltatorii pot crea cache-uri personalizate prin directorul Caches.
RAM Cache (NSCache) stochează datele în memoria RAM — este mai rapid, dar se pierde la repornirea aplicației. Disk Cache este mai lent, dar se păstrează între sesiuni. Strategia optimă utilizează ambele niveluri: memoria pentru date fierbinți, discul pentru date reci.
Da, sistemul poate șterge conținutul directorului Caches în orice moment când spațiul este insuficient. Prin urmare, nu stocați niciodată în cache date care nu pot fi recuperate. Pentru documentele utilizatorului, utilizați directorul Documents.
Dimensiunea cache-ului depinde de tipul datelor: pentru imagini 100–500 MB, pentru răspunsuri API 10–50 MB, pentru video până la 1 GB. Urmăriți hit ratio — dacă scade sub 50%, măriți dimensiunea cache-ului sau schimbați strategia de invalidare.
URLCache.removeAllCachedResponses() șterge cache-ul integrat. Pentru cache-ul personalizat, ștergeți fișierele din directorul Caches prin FileManager. Oferiți întotdeauna utilizatorului posibilitatea de a șterge cache-ul în setările aplicației.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și