Wie geht es mit Firebase Offline-Modus und Daten Push?

8

Bei der Verwendung von Firebase wird empfohlen, den Befehl push () zum Verwalten der Datenliste zu verwenden. Das ist wirklich in Ordnung, es bietet eine eindeutige und geordnete ID für Daten, die in der Liste angezeigt werden.

Wenn Firebase jedoch offline geht (goOffline oder NetworkOffline), wenn die App versucht, Daten in einer Liste zu pushen, wird der Completion-Listener nicht ausgelöst, bis die App wieder online geht: Es gibt also keine eindeutige ID bis zur Zeile ist wieder an.

1 / Ist das das erwartete / normale Verhalten?

2 / Ich habe in dem Dokument (soweit ich mich erinnere) nicht gesehen, dass der Push-Befehl anders arbeitet (oder nur im Onlinemodus) im Offline-Zustand. Habe ich irgendwo eine Leitung vermisst?

3 / Mein Anwendungsfall beschäftigt sich mit Daten, die eine eigene Beziehung haben. Das bedeutet, dass ich ein Objekt (eine Art Master) in einer Liste erstellen und dann diese Master-Objekt-ID (vom Abschluss-Listener bereitgestellt) wiederverwenden soll, um die Beziehung zwischen dem Master-Objekt und allen anderen relevanten Objekten zu erstellen. Wie kann ich mit diesem Offline-Zustand umgehen?

Codebeispiel:

%Vor%

Bearbeiten

Hier sind 4 Möglichkeiten, Daten hinzuzufügen:

Push mit Listener

%Vor%

SetValue mit Listener

%Vor%

SetValue ohne Listener

%Vor%

Push ohne Listener

%Vor%

ES ERSCHEINT, DASS DIE LISTENER NUR AUSGENOMMEN WERDEN, WENN DIE DATEN IN DER DATENBANK AUF DEM SERVER UND NICHT IN DER LOKALEN DB SIND! - IST DAS KORREKT ? - IST DAS DOKUMENTIERT?

Da man sich dessen bewusst ist, ist eine direkte asynchrone Anwendung jetzt schwieriger zu erstellen: Die Kapselung eines asynchronen Jobs kann im Offline-Modus möglicherweise nicht durchgeführt werden, oder?

    
Anthony 12.11.2015, 22:06
quelle

2 Antworten

1

Folgend was @ Andrew-lee und @ Frank-fan-puffelen (danke, dass ihr beide einverstanden seid), die Lösung scheint zu sein:

  1. Erstellen Sie eine eindeutige ID mit dem Befehl push ()
  2. Hinzufügen eines Listeners (Single Value) zu einer Firebase-Referenz des zuvor erstellten Knotens in (1.)
  3. Planen Sie Ihren Job innerhalb des Listeners (hier aktualisieren Sie die Benutzeroberfläche, könnten aber ein anderer Befehl sein)

    %Vor%
Anthony 13.11.2015, 14:17
quelle
10
  

Es gibt also keine eindeutige ID, bis die Zeile wieder aktiv ist

Diese letzte Aussage ist nicht wahr. Firebase-Push-IDs werden clientseitig generiert und sind statistisch garantiert einmalig.

Sie können dies leicht überprüfen, indem Sie Ihre Operation aufteilen:

%Vor%

Die Protokollausgabe zeigt Ihnen die neue Push-ID, auch wenn Sie nicht mit dem Netzwerk verbunden sind.

  

ES ERSCHEINT, DASS DIE LISTENER NUR AUSGELÖST WERDEN, WENN DIE DATEN IN DER DATENBANK AUF DEM SERVER UND NICHT AUF DER LOKALEN DB SIND! IST DAS RICHTIG?

Die Completion-Listener werden erst ausgelöst, wenn die Daten auf dem Server festgeschrieben wurden.

Von der Anleitung zum Speichern von Daten :

  

Wenn Sie wissen möchten, wann Ihre Daten festgeschrieben wurden, können Sie einen Abschlusslistener hinzufügen. Sowohl setValue () als auch updateChildren () verwenden einen optionalen Beendigungslistener, der aufgerufen wird, wenn der Schreibvorgang in der Datenbank festgeschrieben wurde.

Allerdings werden regelmäßige Ereignis-Listener (wie die, die mit addValueEventListener () erstellt wurden) sowohl für lokale als auch für Remote-Bearbeitungen ausgelöst. Dies sind die Listener, die Sie zum Rendern der Benutzeroberfläche usw. verwenden sollten.

    
Frank van Puffelen 12.11.2015 22:42
quelle

Tags und Links