2013-01-20 15 views
10

In base alla propria esperienza, per un'app iOS che utilizza solo un thread principale NSManagedObjectContext, qual è il modo migliore per mantenere le impostazioni utente e i dati memorizzati nella cache dal server a disco rispetto all'affidabilità e alle prestazioni?Miglior strategia di salvataggio dei dati principali (quando salvare i dati sul disco)

vedo prossimi opzioni:

  • salvare contesto alla fine di ogni cambio
  • salvare contesto solo l'uscita di app (come in campioni di Apple)
  • risparmiare contesto all'uscita di app, andare a fondo o non essere attivo (telefonata in arrivo ad esempio)
  • aggiungere il timer per salvare il contesto di volta in volta se ha qualche variazione
  • chiamare la routine di salvataggio ritardata appositamente preparata che si riunirà insieme etere chiama per salvare il contesto per assicurarsi che non sparino troppo spesso

Attualmente usiamo la prima opzione, quindi posso dire che l'affidabilità di esso è molto buona, i dati vengono salvati anche dopo che Xcode termina il app durante la sessione di debug, ma le prestazioni possono risentire quando l'app diventa sempre più complessa, esp. quando le modifiche al DB possono verificarsi in qualsiasi momento del flusso dell'app a causa del caricamento asincrono dei dati dal server.

D'altro canto, il salvataggio di alcuni eventi dell'app (uscita, accesso allo sfondo, ecc.) Offre le migliori prestazioni, ma dalla tua esperienza puoi dire che è sufficiente per garantire che l'utente non perda i dati ?

risposta

4

Salvare il contesto nei metodi UIApplicationDelegateapplicationDidEnterBackground: e applicationWillTerminate: è sempre stato perfetto per me. Risparmio anche in circostanze particolari come un'importazione di grandi quantità di dati o qualcosa di simile.

9

Penso che dovresti risparmiare spesso, perché è più affidabile (non perderai i dati se l'app si arresta in modo anomalo) e puoi risparmiare spazio libero occupato da oggetti modificati ma non utilizzati.
Allo stesso momento non si vuole sommergere db con le richieste di salvataggio.
Il mio suggerimento è di esporre due metodi nel file di interfaccia e scegliere quale si desidera chiamare a seconda della situazione che si ha.

- (void)save { 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(save) object:nil]; 
    [_storage save:nil]; 
} 

- (void)setNeedsSave { 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(save) object:nil]; 
    [self performSelector:@selector(save) withObject:nil afterDelay:1.0]; 
} 

Inoltre, hai considerato l'utilizzo del secondo contesto oggetto gestito con la coda privata? Puoi impostarlo come contesto genitore e salvare/recuperare i dati in background: http://www.cocoanetics.com/2012/07/multi-context-coredata/

+0

Grazie per il collegamento, anche se le soluzioni semplici si sono dimostrate meno soggette a errori, finché non sarà necessario il 100% abbiamo deciso di non utilizzare i dati principali multi-thread. – zubko

1

Ho usato per salvare il contesto su ogni cambiamento ma le prestazioni non sono poi così buone. Attualmente sto salvando il contesto alla fine della funzione di recupero dei dati. Le prestazioni sono 4 volte migliori. Assicurati di avere [context lock] e [context unlock] all'inizio e alla fine della funzione se prevedi di chiamare la funzione asincrona nei thread in background.

Problemi correlati