2016-09-10 1 views
0

Bitte sehen Sie sich den folgenden Code an. Varable v bekommt eine Art String von Firebase db, dann wird es gedruckt.Kann ich in Firebase ein Signal von .observeSingleEventOfType() erhalten, dass es seinen Codeblock ausgeführt hat?

var v = "no" 
let ref = FIRDatabase.database().reference() 

ref.child("db").observeSingleEventOfType(.Value, withBlock: {snapshot in 
    v = snapshot.value!["blah"] as! String//assume it gets "ok" 
    print("This one shouldn't come first") 
})     

print("v is \(v)!!") 

Die tatsächlichen Codes in .observeSingleEventOfType() sind komplizierter, aber dieses ist in Ordnung.

Bei dieser Methode erhält die Variable v eine String. Aber die print-Anweisung würde "ok" aber "no" nicht drucken, da die Methode asynchron ist.

Was ich tun möchte, ist ein Signal oder etwas von .observeSingleEventOfType() erhalten, dass es die Ausführung aller Codezeilen beendet, dann führen Sie die print() Methode.

Ist es möglich zu tun, was ich will? Oder kann ich alle Codes pausieren, bis dieser Codeblock beendet ist?

+0

Sie scheinen Ihre eigene Frage beantwortet zu haben. Wo genau stecken Sie fest? – Dravidian

+0

@Dravidian Der Code soll ein Array von '[String: String]' erhalten und demselben Typ von Variablen zugewiesen werden, die in der Klasse deklariert sind. Der Aufruf der Daten von der designierten Variablen funktioniert nicht direkt nach der Ausführung der '.observeSingleEventOfType()' Methode. –

+0

Ofcource es nicht, seine asynchrone. Sie müssen auf die Variable innerhalb der CompletionBlock zugreifen. Sehen Sie sich auch meine Antwort – Dravidian

Antwort

0

completionBlocks: an ihnen sind so eine Art eines Signals, das Ihre Methode oder Funktion seiner Funktion so etwas wie diese

func printData(){ 

     retrieveData{(retrievedBlah) in 
       print(retrievedBlah) //"Ok" 
       } 
     } 



func retrieveData(completionBlock : ((blah : String!) -> Void)){ 

    ref.child("db").observeSingleEventOfType(.Value, withBlock: {snapshot in 
       v = snapshot.value!["blah"] as! String//assume it gets "ok" 
       completionBlock(blah : v) 
       print("This one shouldn't come first") 
      }) 

     } 

erfolgreich abgeschlossen, aber wenn Sie noch, ob überprüfen wollen oder nicht der Wert, den Sie speichern in DB versucht hat gespeichert worden ist oder nicht, Hören einer eventtype auf diesen Knoten mit nach: -

  • Fall ChildAdded // 0 ausgelöst, wenn ein neuer Kind-Knoten zu einem Standort hinzugefügt wird

  • Fall ChildRemoved // 1, ausgelöst, wenn ein Kind-Knoten von einer Stelle entfernt wird

  • Fall ChildChanged // 2, ausgelöst, wenn ein Kind-Knoten an einer Stelle ändert

  • Fall ChildMoved // 3, ausgelöst, wenn ein Kind Knoten zu den anderen untergeordneten Knoten an einem Ort

  • Fall Wert // 4, relativ bewegt ausgelöst, wenn alle Datenänderungen an einem Ort und rekursiv alle Kinder

Und dann überprüfen, ob es gespeichert oder nicht ...

+0

Die Antwort wird nicht funktionieren. observeSingleEventOfType erwartet eine Auflistung von Werten. Der beantwortete completionBlock-Block wird funktionieren, nachdem der erste Wert abgerufen wurde. Ich denke, OP fragt nach der Fertigstellung des gesamten Datenabrufs. –

+0

Was meinen Sie mit * Abschluss des gesamten Datenabrufs? * Dass der JSON progressiv und bei der ersten Instanz des Abrufs HERUNTERGELADEN wird, wird dieser completionBlock ausgelöst, aber das empfangene Signal ist, wenn der gesamte JSON heruntergeladen wurde. Ist es das? – Dravidian

+0

Was passiert, wenn eine Abfrage ausgeführt wird, die 10 Zeilen abruft?Beispiel FIRDatabaseQuery * recentPostsQuery = [[[[FIRDatenbankdatenbank] Referenz] Kind: @ "StockMaster"] queryLimitedToLast: 10]; [recentPostsQuery observeEventType: FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot * _Nonnull-Snapshot) { NSLog (@ "@% @", snapshot.value); }]; –

Verwandte Themen