Disk Cache è un meccanismo di archiviazione temporanea dei dati sul disco del dispositivo, che consente alle applicazioni iOS di accelerare l’accesso ripetuto alle risorse già caricate. Secondo Apple Developer Documentation, 2024, Disk Cache riduce l’utilizzo della rete, diminuisce il carico della batteria e consente il funzionamento dell’app in modalità offline. iOS fornisce diversi meccanismi di caching integrati: URLCache per le richieste di rete, NSCache per la RAM e implementazioni personalizzate attraverso la directory Caches.
Punti chiave
Disk Cache è una tecnologia per archiviare temporaneamente dati sull’archiviazione permanente del dispositivo (memoria flash) per accelerare le richieste successive agli stessi dati. A differenza della cache RAM, Disk Cache conserva i dati dopo il riavvio dell’app e persino del dispositivo.
iOS fornisce due livelli principali di caching: volatile (NSCache, memoria) e su disco (URLCache, file system). La cache su disco è da 10 a 100 volte più lenta della cache volatile, ma significativamente più veloce di una richiesta di rete — la differenza può essere di 2 o 3 ordini di grandezza. La strategia ottimale utilizza una cache a due livelli: memoria per i dati caldi e disco per i dati freddi.
Secondo Apple Performance Optimization Guide, 2023, un Disk Cache correttamente configurato riduce il tempo di caricamento dei contenuti del 60–80% per le visualizzazioni ripetute e diminuisce il consumo di traffico del 40–70%. Per le applicazioni ricche di contenuti multimediali (immagini, video, audio), il caching è un fattore UX critico.
URLCache è una classe Foundation integrata che implementa una cache combinata per le richieste URLSession. Salva automaticamente le risposte del server su disco e in memoria, gestendo le dimensioni della cache e le politiche di invalidazione basate su intestazioni HTTP come Cache-Control, Expires e 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)
Politiche di caching URLCache determinano quando utilizzare i dati memorizzati nella cache e quando eseguire una nuova richiesta. Le principali politiche includono: useProtocolCachePolicy (basata sulle intestazioni del server), reloadIgnoringLocalCacheData (sempre dal server), returnCacheDataElseLoad (cache prima), returnCacheDataDontLoad (solo cache — modalità offline).
Cache-Control è un’intestazione HTTP che il server invia insieme alla risposta, specificando max-age (durata in secondi), must-revalidate (verificare l’attualità), no-cache (non usare senza verifica) e no-store (non memorizzare nella cache). iOS rispetta rigorosamente queste intestazioni automaticamente quando utilizza URLCache con la politica useProtocolCachePolicy.
Cache personalizzata è necessaria quando l’URLCache integrato è insufficiente — per archiviare immagini elaborate, modelli di dati serializzati o risultati di calcoli. In questi casi, gli sviluppatori creano il proprio sistema di caching basato sulla directory Caches nel Sandbox dell’app.
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)
}
}
Strategie di invalidazione della cache determinano quando i dati archiviati sono considerati obsoleti: TTL (Time-To-Live) — i dati vivono un tempo fisso dopo la scrittura; basata su eventi — invalidazione basata su un evento (es. aggiornamento dei dati sul server); basata sulla versione — invalidazione al cambiamento della versione dell’API o del formato dei dati; LRU (Least Recently Used) — rimozione automatica delle voci meno utilizzate al superamento del limite di dimensione.
Regola pratica: TTL è adatto per notizie e contenuti che diventano obsoleti in modo prevedibile. Basata su eventi per i dati gestiti dal server tramite notifiche push. Basata sulla versione per configurazioni e cache di modelli dati. LRU è una scelta universale per file multimediali con spazio su disco limitato.
Le prestazioni di Disk Cache sono misurate dal rapporto di successo (hit ratio) — la percentuale di richieste soddisfatte dalla cache senza chiamata di rete. Un rapporto di successo tipico per una cache di immagini ben configurata è del 70–90%, per le risposte API — 40–60%, per lo streaming video — 30–50%.
| Tipo di dati | Rapporto di successo tipico | Dimensione cache consigliata |
|---|---|---|
| Immagini | 70–90% | 100–500 MB |
| Risposte API JSON | 40–60% | 10–50 MB |
| Video/Audio | 30–50% | 500 MB — 1 GB |
| Font e risorse | 90–99% | 5–20 MB |
| Contenuti web | 50–70% | 50–200 MB |
Limiti di Disk Cache in iOS: il sistema può eliminare il contenuto della directory Caches in qualsiasi momento quando lo spazio su disco è insufficiente. Questo comportamento non è configurabile — iOS decide quando e quali file della cache eliminare. Pertanto, la cache non deve contenere dati che non possono essere recuperati dalla rete o da altre fonti.
Impatto sulla memoria flash: la scrittura frequente su Disk Cache accelera l’usura dell’archiviazione flash. iOS utilizza TRIM e wear leveling per ridurre al minimo l’usura, ma si consiglia agli sviluppatori di evitare scritture eccessive: non aggiornare la cache più di una volta ogni 5 minuti per lo stesso file; raggruppare le piccole scritture; utilizzare NSCache per i dati temporanei che non devono essere mantenuti su disco.
Cache a due livelli è l’architettura standard per le app iOS: memoria (NSCache) per i dati a cui si accede frequentemente e disco (URLCache o personalizzata) per i dati che devono persistere tra le sessioni. Durata in memoria — minuti, su disco — ore o giorni.
Caching delle immagini: utilizza librerie specializzate (Kingfisher, SDWebImage, Nuke) che implementano una cache a due livelli con invalidazione automatica, gestione della memoria e scrittura asincrona su disco. L’implementazione di una cache di immagini personalizzata richiede la considerazione della decodifica, dello spazio colore e del ridimensionamento.
Cache e sicurezza: non memorizzare dati sensibili (password, token, dati personali) su disco senza crittografia. URLCache non crittografa i dati per impostazione predefinita — utilizza NSFileProtection o la crittografia a livello di applicazione per i contenuti sensibili. Per le richieste di rete autorizzate, utilizza la politica .reloadIgnoringLocalCacheData.
Monitoraggio della cache: monitora il rapporto di successo, la dimensione attuale della cache e le scritture al minuto. Se il rapporto di successo scende sotto il 30%, la cache è inefficiente e richiede una revisione della strategia o un aumento delle dimensioni. Secondo Point-Free (2024), il monitoraggio della cache è una delle pratiche di ottimizzazione delle prestazioni delle app iOS più sottovalutate.
Domande frequenti
Disk Cache è una tecnologia per archiviare dati sul disco del dispositivo per accelerare l’accesso ripetuto. L’URLCache integrato di iOS memorizza nella cache le risposte HTTP e gli sviluppatori possono creare cache personalizzate attraverso la directory Caches.
RAM Cache (NSCache) archivia i dati nella RAM — più veloce, ma persa al riavvio dell’app. Disk Cache è più lento ma persiste tra le sessioni. La strategia ottimale utilizza entrambi i livelli: memoria per i dati caldi, disco per i dati freddi.
Sì, il sistema può eliminare il contenuto della directory Caches in qualsiasi momento quando lo spazio su disco è insufficiente. Pertanto, non archiviare mai dati irrecuperabili nella cache. Utilizza la directory Documents per i documenti utente.
La dimensione della cache dipende dal tipo di dati: 100–500 MB per le immagini, 10–50 MB per le risposte API, fino a 1 GB per i video. Monitora il rapporto di successo — se scende sotto il 50%, aumenta la dimensione della cache o modifica la strategia di invalidazione.
URLCache.removeAllCachedResponses() cancella la cache integrata. Per la cache personalizzata, elimina i file dalla directory Caches tramite FileManager. Offri sempre agli utenti la possibilità di cancellare la cache nelle impostazioni dell’app.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche