2016-06-09 5 views
1

Ich benutze Firebase mit App im Offline-Modus gestartet, wenn ich untergeordnete Werte von einigen Knoten abonnieren den Rückruf von observe*(_:,withBlock:) nicht feuert (weder für die erste Werte noch Änderungen). Abonnements für direkte Werte (kinderlos) funktioniert gut. Werfen Sie einen Blick auf ein Snippet:Firebase gestartet im Offline-Modus, nicht feuern osberve * für Kind Werte

let database = FIRDatabase.database() 
    database.reference().keepSynced(true) 
    let databaseRef = database.reference() 
    database.goOffline() 


    databaseRef.child("user").setValue("user1") 
    let userKey = databaseRef.child("usr").childByAutoId().key 
    let userValues = ["uid": "uid", 
         "name" : "name", 
         "surname" : "surname"] 
    databaseRef.child("/usr/\(userKey)/").setValue(userValues) 

    //1 
    databaseRef.child("user").observeSingleEventOfType(.Value, withBlock:{ snap in 
     print("works") 
    }) 
    //2 
    databaseRef.child("usr").observeSingleEventOfType(.Value, withBlock:{ snap in 
     print("doesnt work") 
    }) 
    //3 
    databaseRef.child("usr/\(userKey)/uid").observeSingleEventOfType(.Value, withBlock:{ snap in 
     print("works") 
    })` 

Abonnements 1 & 2 funktioniert gut, aber 2 Abo wird nicht ausgelöst, bis mindestens einmal Datenbank online gehen. Von dem Moment an, in dem die Datenbank mit der Fernbedienung synchronisiert wird, kann ich offline gehen und alles funktioniert wie es sollte. Wer weiß, wie man mit diesem Problem umgeht?

Antwort

3

Wenn Ihre App offline ist, löst der Firebase-Client Ereignisse aus seinem Cache aus. Wenn Ihre App noch nie eine Verbindung mit den Firebase-Servern hergestellt hat, ist dieser Cache leer.

Das bedeutet, dass der Firebase-Client keine Kenntnis darüber hat, ob an dem von Ihnen angeforderten Speicherort ein Wert vorhanden ist. Aus diesem Grund wird kein Ereignis ausgelöst.

+0

danke für die Antwort. Wenn das der Fall ist, warum wird Ereignis für Fall 1 & 2 im Ausschnitt ausgelöst, wo ich einen einzelnen Wert anstelle eines Kindknotens referenziere? – mprostak

+0

Nummer 3 wird ausgelöst, weil Sie den Wert dieses Standorts in Ihrem eigenen Code festgelegt haben. Daher hat der Firebase-Cache einen Wert für diesen Knoten. Ich denke das gleiche gilt für deinen ersten Test, bin mir aber nicht sicher. –

+0

Für jeden Fall setze ich einen Wert - 1: Wert "user1" für den Knoten "user", für die Sekunde setze ich child node mit Werten für den Knoten "usr", für 3. setze ich einen einzelnen Wert in child Knoten für Knoten "usr". Versteh immer noch nicht, warum für den 2. nicht gefeuert wird. Bitte beachten Sie, dass wenn ich mindestens einmal online gehe, ich im Offline-Modus ohne Probleme arbeiten kann, diese 3 Test Brände normalerweise - wieder, wenn ich App lösche und offline neu starte, probleme. – mprostak

-1

Ich hatte ein ähnliches Problem, aber ich verwendete Deep-Links mit updateChildValues, die irgendwie den lokalen Cache ausgelöst Ereignisse auf intermediate (/ path/intermediate/otherpath) Schlüssel ausgelöst hat. Die Problemumgehung, die ich fand, sollte in dem Wörterbuch, das ich an updateChildValues übergab, ausführlicher sein. (Ich glaube immer noch, dass dies ein Fehler im Firebase SDK ist).

Siehe this Stack Overflow question