2014-06-25 29 views
27

La mia app utilizza Firebase per sincronizzare e ripristinare i dati. Io uso il metodo setValue:withCompletionBlock: per inserire, aggiornare ed eliminare oggetti Firebase. Questo metodo viene chiamato ogni volta che c'è un CoreData salvataggio, la sincronizzazione in tal modo tutte le mie modifiche locali a FirebasePersistenza di Firebase, svuota la cache di Firebase

- (void) setValue:(id)value withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; 

Ora la sincronizzazione file caricati tutti i dati locali per Firebase, mentre il ripristino sostituisce i dati locali con i dati Firebase.

- (void) observeSingleEventOfType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block; 

osservo FEventTypeValue e utilizzare il FDataSnapshot per ottenere i dati dal Firebase e ripristinare i dati locali.

Quindi tutto funziona perfettamente per me finché non ho impostato persistence in Firebase.

[Firebase setOption:@"persistence" to:@YES]; 

Ora, quando persistence inizia, quando aggiorno, diciamo inserire un oggetto in Firebase, e quindi ripristinare i dati prima dell'inserimento viene ripristinata. cioè l'oggetto appena inserito non viene ripristinato. Tuttavia, se ripristino nuovamente, l'oggetto inserito viene ripristinato. La stessa cosa accade quando un oggetto viene cancellato. L'oggetto eliminato riappare quando ripristino per la prima volta e scompare quando ripristino di nuovo. Vedo che gli oggetti Firebase sono inseriti e/o cancellati correttamente attraverso la vista dati Firebase.

Non sono sicuro di cosa sto facendo male qui. Ho solo un problema quando ripristino. Penso che la cache di Firebase stia causando questo problema di ripristino. Sto pensando di cancellare la cache di Firebase prima del ripristino. La mia domanda è

  1. Cancellare la cache prima di ripristinare un buon metodo?
  2. Se sì, come cancellare la cache di Firebase?
  3. Se no, puoi suggerirmi il metodo migliore per ripristinare i dati.

risposta

24

Questo è purtroppo il comportamento previsto con l'attuale versione beta di persistenza del disco. Puoi probabilmente aggirare il problema usando observEventOfType invece di observeSingleEventOfType

Fondamentalmente, ogni volta che osservi i dati, estrarremo prima i dati dalla nostra cache persistente. Questi dati saranno qualsiasi dato che abbiamo ricevuto da Firebase. Poiché stai usando observSingleEventOfType invece di observEventOfType, non riceverai aggiornamenti regolari da Firebase e quindi i dati che abbiamo memorizzato nella cache in realtà non includeranno gli ultimi dati che hai scritto.

Come una semplice soluzione, è possibile aggiungere semplicemente observEventOfType ai dati in questione. In realtà non è necessario fare nulla con gli eventi. Ma se li ascolti tutto il tempo, la tua app riceverà i dati più recenti da Firebase e quando chiami observSingleEventOfType, puoi essere certo che avrà gli ultimi dati nella cache.

Questo è un po 'hacky e intendiamo semplificare questa API prima di rilasciare la funzione di persistenza in un modulo non beta. Scusa per il dolore!

+7

È ancora così? Sembra che io stia correndo su questo stesso problema. Verifica se il nome utente esiste, se no, crea utente. Se l'utente si disconnette e prova a creare un nuovo utente con lo stesso nome utente, funzionerà perché la cache non viene aggiornata. –

+6

Sono stato un grande fan di Firebase. Ma per questo, devo dire onestamente che questo è un grosso limite. Firebase dovrebbe aggiungere un nuovo parametro nel metodo 'fetchNewData: Bool'.Il comportamento previsto imprevisto non è un comportamento previsto. Ci sono molti casi in cui ciò potrebbe fallire, ad es. Impaginazione. La maggior parte di noi non osserverebbe il valore di una pagina quando si esegue l'impaginazione, altrimenti la pagina precedente potrebbe essere aggiornata e il concetto di impaginazione stesso (ovvero ridurre il trasferimento di dati) è diventato inutile poiché il metodo di osservazione continua ad aggiornare i dati della pagina precedente e anche noi non possiamo usare 'removeObserver' –

+0

Qualche correzione per questo? – Relm

Problemi correlati