2017-07-28 6 views
3

Ich möchte die erforderliche App-Versionsnummer beim Start der App abrufen. Aber ich kann nicht den richtigen Schlüssel bekommen.ObserveSingleEvent gibt alte Daten zurück

Ich habe diesen Code zu holen. Ich verwende einzelne Ereignisse beobachten, da ich diese Methode verwende, um die erforderliche Versionsnummer der App zu überprüfen. Diese Methode wird nur ausgelöst, wenn die App mit der Überprüfung beginnt.

func getVersion(completionHandler: @escaping (Result<Any?>) ->()) { 

    let ref: DatabaseReference! = Database.database().reference().child("version").child("IOS") 

    ref?.observeSingleEvent(of: .value , with: { snapshot in 

     if snapshot.exists() {  
      let recent = snapshot.value as! NSDictionary 
      print(recent) 
     } 
    }) 
} 

Aber es gibt alte Ergebnisse zurück? Ich habe isPersistenceEnabled bei meiner Appdelegate aktiviert.

Dies ist die Datenbankstruktur:

enter image description here

ich keine Ergebnisse erhalten, wenn ich Database.database().reference().child("version").child("IOS"). snapshot.exists verwenden, ist falsch, wenn ich das verwenden.

Was ich bisher hatte war: - version | IOS - 1.0

Und ich bekomme das Ergebnis, wenn ich Database.database().reference().child("version"), namely {iOS => 1.0} verwende. Ich verstehe es nicht, weil es meine alte Struktur war.

+0

Wenn 'isPersistenceEnabled 'auf' true 'gesetzt ist, rufen die Beobachter Daten zuerst vom lokalen Speicher ab. Da "observeSingleEventOfType" nur einmal beobachtet werden soll, werden nur Daten vom lokalen Speicher abgerufen. –

+0

@MuhammadHassan Gibt es eine Möglichkeit, die Daten neu zu laden? – da1lbi3

Antwort

2

Die Firebase Realtime Database synchronisiert und speichert eine lokale Kopie der Daten für aktive Listener. Darüber hinaus können Sie bestimmte Standorte synchron halten.

let scoresRef = Database.database().reference(withPath: "scores") 
scoresRef.keepSynced(true) 

Die Datenbank-Client-Firebase Realtime lädt automatisch die Daten an diesen Stellen und hält sie synchron, auch wenn die Referenz keine aktiven Zuhörer hat. Sie können die Synchronisation mit der folgenden Codezeile wieder ausschalten.

scoresRef.keepSynced(false) 

Haben Sie versucht es nicht wirklich, aber es sollte funktionieren.

0

Die Methode observeSingleEvent wird für Daten verwendet, die sich nicht wirklich ändern. Daher wird sie aus dem lokalen Cache abgerufen, wenn die Persistenz aktiviert ist.

Diese Android-Lösung (https://stackoverflow.com/a/40477280/883413) bietet eine Problemumgehung mithilfe einer alternativen Methode runTransactonBlock.

Transaktionen bieten die Möglichkeit, Daten vor dem Speichern zu bearbeiten. Hier können wir die Daten einfach als korrekt akzeptieren, da wir nur die neuesten Werte lesen wollen.

let ref: DatabaseReference! = Database.database().reference().child("version").child("IOS") 
ref.runTransactionBlock({ (data) -> TransactionResult in 
    return TransactionResult.success(withValue: data) 

}, andCompletionBlock: { (error, success, snapshot) in 
    if let snapshot = snapshot, snapshot.exists() { 
     if let recent = snapshot.value as? NSDictionary { 
      print(recent) 
     } 
    } 
}) 
Verwandte Themen