2015-04-03 6 views
11

Sto sviluppando un'applicazione simile a quella di Instagram (visualizzazioni di tabelle con celle che contengono immagini e alcune etichette).iOS: best practice per salvare le immagini localmente - NSCache vs Salva nella directory documenti

Per tutti i dati che ottengo dal database, sto utilizzando Data Task (perché non ci vuole molto per riceverli), ma per le immagini (che il loro url ottengo con la richiesta di dati) , Ho bisogno di salvare localmente per uso futuro (migliorare l'esperienza dell'utente).

La mia logica è la seguente: Salva in NSCache o in Elenco documenti, le immagini all'interno della cartella con la data in cui sono stati scaricati (crearla una volta e aggiungere tutte le altre immagini, se necessario) (sto eliminando ogni cartella che non è degli ultimi 7 giorni), e poi per il TableView, basta caricare se da lì, in modo che il tableview scorrerà senza problemi e non caricherà l'url direttamente dal suo metodo delegato. Quindi, dove è il posto migliore per memorizzarli in base alle mie esigenze, NSCache o Document Directory.

In attesa di sentire i vostri suggerimenti, grazie!

+0

[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. –

+2

@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? –

+0

@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? –

risposta

33

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:

  1. 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.

  2. 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).

+0

Grazie ancora per la fantastica risposta, quindi solo per rendere la cosa un po 'più semplice - Non è consigliabile utilizzare la directory dei documenti, Si consiglia di utilizzare un meccanismo la cartella NSCache e hos nell'ordine seguente: CASO 1: check in NSCache , caso 2: check in Cache directory, CASE 3: download di nuovo, domande di follow up: 1) C'è un limite nella directory Cache? 2) Quando lo scarico online, lo memorizzo immediatamente sia in CASE 1 che in CASE 2? o aspetto che NSCache lo rimuova e poi lo aggiungo alla cartella Cache? 3) Salvare le immagini come file all'interno della cartella Cache? Grazie!!!!!!!!!!! –

+0

Il limite nella cartella della cache è la memoria permanente disponibile totale (anche se potresti voler essere un buon cittadino e vincolare il fatto che se hai bisogno di un'app necessiterà di quantità straordinarie di spazio di archiviazione). Personalmente conserverei sempre la cache nella memoria persistente e mi stavo rimettendo in cache a NSCache immediatamente quando il download, se si sta facendo il caricamento pigro, sì; se stai facendo il carico ansioso, allora probabilmente no. E, sì, quando si effettua il salvataggio in una memoria persistente, probabilmente lo scriverò come un file, sebbene NSURLCache utilizzi SQLite. – Rob

+0

Beh, alla fine sono riuscito a trovare un soltuin "ok", dimmi cosa ne pensi ::: DataTask che ottiene le ID delle celle future -> Controlla se l'ID esiste nel DB presonal (Havent ha capito se utilizzando NSDirectory o dati di base) -> Se esiste -> carica le immagini, il testo ecc 'in locale -> Se non esiste -> Scarica -> Salva localmente -> Carica localmente ....... Nessun utilizzo di NSCache , solo CacheDirectory, diminuirà la preferenza? –

Problemi correlati