2010-06-21 17 views
12

Sto lavorando a un'applicazione supportata da Core Data. In questo momento, sto salvando il contesto oggetto come e quando aggiungo o elimina un'entità da e verso il contesto. Ho paura che influirà sulle prestazioni, quindi stavo pensando di ritardare il salvataggio. In effetti, potrei posticiparlo fino al termine dell'applicazione. È troppo rischioso salvare i dati solo quando l'applicazione sta per chiudere? Con quale frequenza dovrei chiamare il salvataggio su Object Context?Quante volte dovrei salvare in Core Data?

Stavo pensando di avere un thread separato per gestire il salvataggio: attenderà un semaforo. Ogni volta che una parte dell'applicazione richiama un metodo helper/util per salvare i Core Data, diminuirà il semaforo. Quando è a zero, il "save thread" farà un salvataggio una volta e incrementa il semaforo a, diciamo, 5, e poi riaddormenta.

Qualche buona raccomandazione? Grazie!

risposta

9

È necessario salvare frequentemente. Le prestazioni effettive dell'operazione di salvataggio hanno molto a che fare con il tipo di archivio persistente che stai utilizzando. Poiché gli archivi binari e XML sono atomici, devono essere completamente riscritti su disco su ogni salvataggio. Man mano che il tuo oggetto grafico cresce, questo può davvero rallentare la tua applicazione. L'archivio SQLite, d'altra parte, è molto più facile da scrivere in modo incrementale. Quindi, mentre ci saranno alcune cose che vengono scritte al di sopra e al di là degli oggetti che stai salvando, il sovraccarico è molto più basso rispetto ai tipi di negozi atomici. I salvataggi che interessano solo pochi oggetti saranno sempre veloci, indipendentemente dalla dimensione complessiva del grafico dell'oggetto.

Detto questo, se si importano dati in un ciclo, ad esempio, attenderei la fine dell'intera operazione per salvare anziché salvare su ogni iterazione. Il tuo obiettivo principale dovrebbe essere quello di prevenire la perdita di dati. (Ho scoperto che gli utenti non si preoccupano molto di questo!) Le prestazioni dovrebbero essere un secondo vicino. Potrebbe essere necessario fare del lavoro per bilanciare la frequenza del salvataggio con le prestazioni, ma la soluzione descritta sopra sembra eccessiva a meno che non si sia identificato un problema di prestazioni specifico e significativo.

+0

Grazie per la risposta rapida. I miei oggetti non sono enormi, ma l'oggetto è un po 'complicato. Il negozio sottostante è SQLite, quindi come hai detto, dovrebbe andar bene. C'è un altro problema che ho riscontrato di recente: creo un oggetto entità nel contesto e lo salvi. In un breve momento, se elimini quell'entità (recuperata in seguito utilizzando un FetchedResultsController), otterrei un errore che ha qualcosa a che fare con la coerenza interna. Penso che sia perché il contesto non ha aggiornato il grafo degli oggetti in memoria? – Justin

+1

Vorrei aggiungere a questo che vuoi rendere la tua frequenza di salvataggio effettiva una variabile o un '# define' in modo che, una volta che sei in fase di test, puoi mettere a punto la frequenza di salvataggio e guardare i risultati in Strumenti. –

0

Il miglior modo di pensare, è quello di salvare dopo ogni oggetto. Se succede qualcosa come un improvviso incidente, nulla andrà perso.

Alcuni miglioramenti delle prestazioni, se si aggiungono molti oggetti, è di eseguire il batch. Aggiungi tutti gli oggetti al contesto rispetto al salvataggio. Questo è utile ad esempio se si aggiungono oggetti molto in un loop. La tua idea è simile, ma potrebbe esserci molto tempo tra i salvataggi, in cui il programma potrebbe bloccarsi.

Non credo che l'aggiunta di un singolo oggetto sarebbe un problema di prestazioni. Quanto sono grandi i tuoi oggetti, contengono molti dati?

+0

MAI salvare dopo ogni incidente. Questo uccide le prestazioni morte. –

+1

Salva dopo ogni incidente? Penso che sia un errore di battitura. Sicuramente se l'utente sta dettando i salvataggi creando oggetti, l'utente non è in grado di creare oggetti abbastanza veloci da rallentare l'applicazione. Se pensi che rallenti la tua applicazione abbastanza da rischiare di non risparmiare abbastanza. Si prega di fornire prove, tutti i miei parametri di riferimento sono stati accettabili. –