2017-03-03 2 views
0

Ich lese ein paar Fragen dazu. Aber ich habe immer noch Probleme mit asynchronen Funktionen.Asynchrone Funktionen und Firebase mit Swift 3

Zum Beispiel: Ich habe ein viewController1 wo eine Taste, um ein viewController2 eine segue auszuführen. In der Klasse viewController2 initialisiere ich einige Werte in einer anderen Klassendatei mit dem Namen exampleClass. Diese Werte werden aus Firebase-Datenbank- oder Standortwerten abgerufen. Diese Werte brauchen einen kleinen Moment, der abgerufen werden muss. Ich gebe diese Werte von exampleClass in meine viewController2 zurück. Ich drucke diese Werte in viewController2viewDidLoad().

Mein Problem: Das Gerät wartet nicht, dass die Werte abgerufen werden und folgende Funktionen ausführen. Ergebnis: Wenn ich den Knopf berühre, sind die gedruckten Werte nil Werte. Es kann auch die App zum Absturz bringen, wenn ich den Code nicht absichern kann.

Was ich bisher gefunden habe: ich gelernt, dass ich nur eine func am Ende eines Firebase snapshot nennen müssen (zum Beispiel) wie folgt aus:

userRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in 
     self.name = snapshot.value as! String! 
     print(self.name) 
     self.forceEnd() 
    }) { (error) in 
     print(error.localizedDescription) 
    } 

ich diese Funktion mit dem Namen forceEnd deutlich sein. Das funktioniert nicht für mich. Ich habe auch versucht, Handler zu erstellen, aber keine positiven Ergebnisse.

Meine Frage: Wie kann ich das Gerät zwingen, auf die Werte zu warten, bevor die folgende Frage ausgeführt wird?

Antwort

1

Wie kann ich das Gerät zwingen, auf die Werte zu warten, bevor die folgende Frage ausgeführt wird?

  • Sie wollen nicht zu Kraft das Gerät zu warten, müssen nur einige Operationen auszuführen, sobald diese Werte von Firebase Datenbank abgerufen werden.
  • Durchführung einer Operation asynchron in vielfältiger Weise wie blocks kann protocols, notifications usw.

Allgemeinen Blöcke sind die elegantere Vorgehensweise durchgeführt werden.
Einige Beispielcode kann wie:

func myFirebaseNetworkDataRequest(finished:() -> Void) { // the function thats going to take a little moment 

    ... 

    print("Doing something!") // firebase network request 

    finished()  
} 


// usage of above function can be as- 

override func viewDidLoad() { 

    myFirebaseNetworkDataRequest { 

      // perform further operations here after data is fetched 
      print("Finally! It took a lot of moments to end but now I can do something else.") 
    } 
} 
+0

, die nicht funktioniert. Hier ist meine Funktion: 'func initUserName (abgeschlossen: @escaping() -> Void) { laß userRef = ref.child (" Benutzer "). Child ((user? .uid)!). Child (" name ") userRef.observeSingleEvent (von: .value, mit: {(Snapshot) -> Void in lassen Name: String = snapshot.value als String self.name = name fertig() }) {(Fehler) in print (error.localizedDescription) } } ' –

+0

wie folgt verwendet:.' Hauptbenutzer() initUserName() { print ("Daten abgerufen") } ' –

+0

verwenden ich es richtig? –