Come creare un sistema di cache delle immagini in Swift

Le richieste di rete sono uno dei fattori che possono creare maggiori danni all’esperienza utente di una applicazione. Questo aspetto si può applicare in particolare al download delle immagini. Bisogna infatti tenere in considerazione che non tutti gli utenti hanno a disposizione una connessione ad internet veloce in ogni momento in cui usano la nostra app. Questo influisce negativamente sulla velocità di download dei contenuti necessari all’applicazione. Anche quando la velocità della connessione internet non è un problema, potrebbe essere spiacevole consumare tutto il quantitativo di GB di internet per riscrivere gli stessi contenuti ogni volta che si avvia l’app.

Cosa si potrebbe fare per ottimizzare le richieste di rete che vengono effettuate? Una delle soluzioni più comuni è quella di mettere in cache i dati che sono stati scaricati così da non dover riscaricare le stesse informazioni ad ogni accesso. Questo aspetto si sposa bene con le immagini. In questa guida vorrei mostrarti come creare un sistema di cache delle immagini in Swift utilizzando NSCache di Apple.

Creare un sistema di cache delle immagini in Swift

Cos’è NSCache?

Apple definisce un oggetto NSCache una collezione mutabile che memorizza una coppia chiave-valore in maniera simile a come fa un dizionario. La classe NSCache offre una interfaccia programmatica per aggiungere e rimuovere oggetti e impostare le politiche di eliminazione dei dati salvati in cache in base al numero totale di oggetti che sono già stati memorizzati.

Per farla breve, a differenza di CoreDataUserDefaults, i dati che vengono salvati in memoria sfruttando  NSCache vengono cancellati quando il sistema operativo richiede maggiore spazio oppure non vengono più utilizzati.

Informazioni preliminari

Per spiegarti il funzionamento di NSCache, ti farò vedere un esempio che utilizza URLSession per il download delle immagini. È importante menzionare che URLSession è effimero. I think it’s important to mention here, in the example that I am using, the URLSession is ephemeral. Effimero significa essere fugace o di breve durata.

Ciò significa che tutto quello che scarichiamo quando usiamo la classe URLSession viene memorizzata in RAM invece che sul disco. Questi dati vengono eliminati in automatico quando la sessione è finita. Per questo motivo è essenziali costruire un sistema di caching per tutti i dati non volatili che devono essere scartati a seguito di una richiesta di rete.

Come usare NSCache per tenere in memoria le immagini in Swift

Avvia Xcode e crea un nuovo progetto. Crea un nuovo file Swift e chiamalo, ad esempio, ImageService. Questo sarà il file che conterrà la classe che gestirà le richieste di rete delle immagini e si occuperà di gestirne la cache. All’interno di questo nuovo file definisci la classe ImageService e definisci una nuova variabile che si occuperà di gestire la cache.

cache delle immagini in Swift

In precedenza ti ho presentato NSCache come un sistema simile ai dizionari nel funzionamento. Per come abbiamo definito la variabile imageCache, andremo a mettere in cache le immagini associandole ad una stringa. Questo significa che ogni volt che vorremo accedere all’immagine messa in cache dovremo richiamarla tramite la stringa che è associata ad essa.

Una buona chiave per memorizzare le immagine è l’URL dal quale l’immagine viene scaricata. In questo modo possiamo fare una verifica rapida prima di iniziare la richiesta di rete. Se il dato esiste in cache, allora possiamo evitare di richiederlo al server.

A questo punto possiamo passare alla definizione del seguente metodo:

func downloadImage(url: URL, completion: @escaping (UIImage?,Error?) -> Void)

Questa funzione accetta un URL a ritorna una UIImage tramite una callback. Come detto in precedenza, effettueremo il controllo dell’immagine in cache tramite l’URL del dato in formato stringa. Possiamo avere questo dato usando il metodo absoluteString di URL e poi effettuando il cast da String NSString.

Se l’immagine esiste, la ritorniamo tramite la callback, altrimenti effettuiamo la richiesta di rete, memorizzano l’immagine scaricata in cache e poi ritorniamo l’immagine tramite la callback.

L’ utilizzo della classe NSCache per memorizzare dati in cache è molto semplice. Nel nostro caso specifico lo abbiamo utilizzato per salvare dati di tipo immagine. Nulla vieta di sfruttare le potenzialità di NSCache anche per memorizzare altri tipi di dati. Fammi sapere cosa ne pensi di questa soluzione per creare un sistema di cache delle immagini in Swift. Se hai dubbi o suggerimenti, puoi scriverci tramite la sezione commenti presente alla fine di questi articolo.

Condividi.

Informazioni autore

Ingegnere Informatico laureato presso il Politecnico di Milano. Appassionato di tecnologia e programmazione. Esperto e utilizzatore dei prodotti Apple ma anche di Android e Linux.

Articoli Correlati

Lascia un commento

avatar
  Iscriviti  
Avvisami