NSCache
e l'archiviazione persistente ha scopi ampiamente diversi. NSCache
conserva l'elemento in memoria e viene utilizzato per prestazioni ottimali. Ma occupa memoria (RAM) e dovresti assicurarti che, se usi NSCache
, rispondi alle avvertenze sulla memoria e in questi casi svuoti lo NSCache
. E quando l'app termina, lo NSCache
viene perso.
L'utilizzo della cache di archiviazione persistente (generalmente la cartella Caches
) viene utilizzata per uno scopo diverso, evitando di dover recuperare nuovamente l'asset tramite alcune richieste di rete, ma senza conservare la risorsa in memoria. Ciò lo rende un ottimo meccanismo di cache tra le sessioni di esecuzione dell'app o in situazioni in cui è possibile che si sia verificata una pressione della memoria, ha eliminato lo NSCache
, ma non ha voluto recuperare nuovamente la risorsa dalla rete.
nota che ho citato la cartella Caches
per la memorizzazione permanente, mentre sembravi presumere che si potrebbe utilizzare la cartella Documents
, ma ci sono due considerazioni:
di Apple è sempre più particolare sulle applicazioni utilizzando solo Documents
cartella per i dati utente che non possono essere facilmente ricreati e utilizzando la cartella Caches
per i dati che possono essere facilmente recuperati nuovamente. Vedere File System Basics per ulteriori informazioni.
A partire da iOS 11, è necessario archiviare solo i documenti visibili dell'utente nella cartella (vedere WWDC 2017 Fall video, iOS Storage Best Practices). Anche se internamente avevi usato file che non erano facilmente ricostruibili, a meno che l'intento fosse quello di esporre l'utente a loro, dovresti usare la directory Application Support
, non la cartella .
Linea di fondo, si potrebbe utilizzare la cartella in genere Caches
per una cache basata memorizzazione persistente.
Nota, utilizzeremo spesso un meccanismo di cache a due livelli. Cache la risorsa a entrambiNSCache
e la cartella Caches
. Quindi, quando si va a recuperare una risorsa, controllare prima NSCache
(molto velocemente), se non ci sono, controllare la memoria persistente e, se non ci sono, recuperare nuovamente la risorsa dalla rete.
Detto tutto questo, per rendere ancora più complicato, v'è un terzo tipo di cache, che è fornito da NSURLCache
(cioè risposte per richieste di rete sono memorizzati nella cache trasparente da NSURLSession
e NSURLConnection
). Questa cache è dettata da regole scarsamente documentate (ad esempio non memorizza nella cache nessun singolo elemento le cui dimensioni superano il 5% della dimensione totale della cache) ed è soggetta alle intestazioni HTTP fornite dalla risposta di rete. Questa cache, tuttavia, opera in modo ampiamente trasparente per te e fornisce sia memoria che cache di memorizzazione persistenti. Spesso puoi godere del comportamento di caching di NSURLCache
senza alcun intervento da parte tua. È senza soluzione di continuità (quando funziona).
[SDWebImage] (https://github.com/rs/SDWebImage) potrebbe risolvere il tuo problema. Memorizza l'immagine nel disco. NSCache potrebbe non essere una buona scelta, perché verrà svuotato automaticamente quando il sistema ha poca memoria. –
@HaiFengKao Preferisco pure swift, nessuna libreria di terze parti. Posso iniziare a costruire la soluzione da solo, sto solo cercando il percorso corretto. Altri suggerimenti si accoppiano? –
@HaiFengKao forse evolverà questi due insieme? per il momento in cui lo ha scaricato, lo memorizza all'interno di NSCache, e prima che l'immagine "termini" lo memorizzi localmente per uso futuro? –