2013-04-14 23 views
5

Il problema:Core Data vs NSFileManager

Sto usando da qualche tempo il mio sistema di cache utilizzando NSFileManager. Normalmente i dati che ricevo sono JSON e salvo salvare il dizionario direttamente nella cache (nella cartella Documenti). Quando ne avrò bisogno, andrò a prenderlo. Implemento anche, a volte quando ritengo sia preferibile, un NSDictionary nella cartella principale con chiavi/valori per il percorso di una determinata risorsa. Ad esempio:

Risorsa sul tempo a Ginevra 17/02/2013, quindi avrei una chiave chiamata GE_17_02_2013 e il valore del percorso per il NSDictionary con le informazioni.

Normalmente non è necessario eseguire query complesse. Ma, in qualche modo, e da quello che sto leggendo, quando hai molti dati, dovresti mantenere i Core Data. Nel mio caso, di solito ho molti dati, ma in realtà non ho mai sentito l'applicazione andare giù, o soffrire in termini di prestazioni. Quindi le mie domande sono:

  1. In questo caso, dove a volte (la cosa tempo era solo un esempio) ho bisogno di rimuovere solo tutti i dati (un feed Twitter, per esempio) e sostituirlo con un flusso di dati completamente nuovo, è il valore di core dati? Penso che rimuovere tutti i dati e inserirli (popolandoli) sia più pesante di un semplice archivio NSDictionary e la sostituzione di quello vecchio.

  2. volte sarebbe envolve immagini, file di testo, ecc e la NSFileManager lo fa alla perfezione, quindi quali vantaggi potrebbe core Dati portare in questi casi?

P.S: Ho appena visto this inviati, in cui è fatto questo tipo di domanda e numeri dimostrare che uno è effettivamente più veloce. Tuttavia, vorrei anche una risposta empirica.

risposta

2

I dati fondamentali sono utili in ogni scenario che hai descritto. Infatti, se un'app memorizza più delle preferenze, dovresti probabilmente utilizzare i dati principali. Ecco alcuni motivi, tra i quali, troverete le risposte ai vostri problemi:

  • è sicuramente più veloce del file system, anche se si spazzare via tutto e scriverlo di nuovo come lei (e quindi non si fa trarre beneficio dalla memorizzazione nella cache). Questo è fondamentalmente perché puoi coalizzare le tue operazioni e accedere al negozio solo quando necessario. Quindi se leggi, scrivi e leggi, puoi salvare solo una volta, il resto viene fatto in memoria, il che è, inutile dirlo, molto veloce.
  • è tutto versione ed è possibile migrare facilmente da una versione all'altra (mantenendo il contenuto che l'utente ha sul dispositivo)
  • L'80% delle operazioni del modello è gratuito. Ad esempio, quando qualcosa cambia, è possibile ignorare il metodo dell'oggetto gestito willSave e notificare i controller.
  • usando cascade rende banale per eliminare le strutture di oggetti anche molto complessi
  • mentre è una cattiva idea per mantenere le immagini nel database, è ancora possibile tenerli sul filesystem ed avere dati fondamentali eliminarli automaticamente quando l'oggetto gestito che li rappresenta è cancellato
  • è flessibile, infatti è così flessibile che è possibile migrare il progetto dall'utilizzo del filesystem locale all'utilizzo di un server con pochissime modifiche scrivendo un archivio dati personalizzato.
  • il progettista di dati di base in pratica crea gli oggetti del modello per te. Non è necessario per creare le proprie classi del modello (che si sarebbe dovuto se si utilizza il file system)
+0

la cache è più per gli scenari offline. Quindi, in condizioni normali con accesso a Internet, di solito sostituisco i dati archiviati molto frequentemente, ecco perché ho avuto dubbi. Un altro vantaggio, è il fatto di usare solo un "NSDictionary" e di non avere il bisogno di sapere cosa c'è dentro di lui (come è composto). Avrebbe senso avere "NSManagedObject" con un solo "NSDictionary"? – Peres

+0

La cache è importante anche per il filesystem locale. L'accesso al filesystem è molto più lento dell'accesso alla memoria. Non sono sicuro del motivo per cui non hai bisogno di sapere cosa c'è dentro quel dizionario, non lo leggi/interpreti come un punto.Se memorizzi solo un file come un altro, che è un dizionario serializzato, allora sì, non ha senso usare Core Data –

+0

Voglio dire, so cosa c'è dentro, ma se per qualche ragione un'API cambia e aggiungi cose diverse , Non sono limitato a questo. – Peres

1

In questo caso ... ne vale la pena dati di base?

Sì, nella misura in cui è necessario qualcosa di più gestito centralmente rispetto al tentativo di elaborare il proprio schema del file system. Core Data e il suo cugino SQL di livello inferiore sono ancora la scelta migliore per la persistenza che abbiamo adesso. Inoltre, l'impatto sulle prestazioni dell'uso di NSKeyed(Un)Archiver per continuare a serializzare/deserializzare un dizionario più e più volte diventa sempre più evidente con set di dati più grandi.

ritengo rimuovere tutti i dati, ed inserendo (compilazione) esso, è più pesante che solo memorizzare il NSDictionary e che sostituisce quello vecchio.

Assolutamente sì. Ma non devi pensare al turnover della cache in questo modo. Se si immagina Core Data come modello statico, è possibile utilizzare un livello di cache per traghettare i dati dentro e fuori lo store. Hai bisogno di quella risorsa per il tempo? Controlla il livello della cache. Se non è lì, fai in modo che la cache esegua una richiesta di recupero. Hai bisogno di girare l'intera cache? Lascia che la cache si svuoti da sola, quindi esegui una richiesta per contrassegnare ogni entità con qualche tipo di flag per mostrare che non sono validi. La costosa eliminazione di cui ti stai preoccupando può essere eseguita da un processo in background quando vedi che tutti i tuoi nuovi dati sono stati internati in modo sicuro nella cache.

volte sarebbe envolve immagini, file di testo, ecc e la NSFileManager lo fa alla perfezione, quindi quali vantaggi potrebbe Core Data portare in questi casi?

Sfortunatamente, non molti. Per i blob di dati (che è essenzialmente ciò che i dati di base fanno in queste situazioni), lo storage e i recuperi da e verso i Core Data possono diventare rapidamente costosi. Possono anche occupare uno spazio notevolmente più grande sul disco se non sono compressi (il che riduce ulteriormente le prestazioni). Se hai bisogno di un'alternativa più veloce, utilizza uno store più adatto all'attività come Tokyo Cabinet o LevelDB e utilizza le entità nell'archivio dei dati principali come una sorta di sostituta che, ad esempio, contiene la chiave della risorsa in una quei database relazionali.

+0

Io uso quel meccanismo (invalidazione) con l'approccio 'NSFileManager'. Con grandi quantità di dati. Grazie per l'input Robert. – Peres