2017-05-11 1 views
0

Wenn ich versuche, Informationen von meinem Firebase-Server abzurufen, lade ich die Daten in bestimmte Variablen, damit ich später darauf zugreifen kann. Es scheint, dass ich nur auf die variablen Daten in der Swift-Funktion zugreifen kann, wo es die Daten von der Firebase-Datenbank erhält. Unten habe ich eine Druckfunktion, diese Druckfunktion druckt die richtigen Daten, aber wenn ich versuche, diese Daten später im Code zu drucken, wird nichts gedruckt.Variable nicht beim Speichern von Informationen aus Firebase mit Swift

(Ich verwende Swift 3.0 und Xcode Version 8.1)

Mein Code für diesen speziellen Ort:

func loadAllDataFromServerAboutGame(){ 

     ref.child("\(gamePIN)").observeSingleEvent(of: .value, with: { (snapshot) in 
      // Get user value 
      let value = snapshot.value as? NSDictionary 
      self.player1Name = value?["player1Name"] as? String ?? "" 
      self.player2Name = value?["player2Name"] as? String ?? "" 
      self.player3Name = value?["player3Name"] as? String ?? "" 
      self.player4Name = value?["player4Name"] as? String ?? "" 
      self.player5Name = value?["player5Name"] as? String ?? "" 
      self.player6Name = value?["player6Name"] as? String ?? "" 

      self.playerAmountBeforeTextChanging = value?["numberOfPlayers"] as? String ?? "" 

      self.player1UID = value?["player1UID"] as? String ?? "" 
      self.player2UID = value?["player2UID"] as? String ?? "" 
      self.player3UID = value?["player3UID"] as? String ?? "" 
      self.player4UID = value?["player4UID"] as? String ?? "" 
      self.player5UID = value?["player5UID"] as? String ?? "" 
      self.player6UID = value?["player6UID"] as? String ?? "" 

      if let myNumber = NumberFormatter().number(from: self.playerAmountBeforeTextChanging) { 
       self.numberOFPLayers = myNumber.intValue 
      } else { 
       print("Error converting text into 'int' value!") 
      } 

      print("Transcription: \(self.numberOFPLayers)") 
      print("Player 3 Name: \(self.player3Name)") 

      // ... 
     }) { (error) in 
      print("DataBase ERROR:\(error.localizedDescription)") 
     } 

    } 

Vielen Dank im Voraus!

+0

Sie benötigen eine ganze View-Controller laden. Es scheint, als ob Sie die Variablen ausdrucken, bevor sie gesetzt wurden. Dies liegt daran, dass das Beobachtungsereignis asynchron ist, sodass jeder Code außerhalb der Sperrung aufgerufen werden kann, bevor die Sperrung abgeschlossen wurde. –

Antwort

0

Sie müssen daran denken, dass die observeSingleEvent asynchron abgefeuert wird, und es daher eine gute Idee sein könnte, es in eine Dispatch-Gruppe zu setzen.

Was ich vorschlagen Sie tun, ist das Ausführen der Methode loadAllDataFromServerAboutGame von innerhalb einer Gruppe, und nichts tun, bis nach dem Brennen abgeschlossen ist, und alle Daten wurden in die Variablen geschrieben.

Wo Sie loadAllDataFromServerAboutGame rufen

let group = DispatchGroup() 
group.enter() 
loadAllDataFromServerAboutGame() 

group.notify(queue: .main, execute: { 
    // Do something 
} 

Ihre loadAllDataFromServerAboutGame Methode:

func loadAllDataFromServerAboutGame(){ 

    ref.child("\(gamePIN)").observeSingleEvent(of: .value, with: { (snapshot) in 
     // Get user value 
     let value = snapshot.value as? NSDictionary 
     self.player1Name = value?["player1Name"] as? String ?? "" 
     self.player2Name = value?["player2Name"] as? String ?? "" 
     self.player3Name = value?["player3Name"] as? String ?? "" 
     self.player4Name = value?["player4Name"] as? String ?? "" 
     self.player5Name = value?["player5Name"] as? String ?? "" 
     self.player6Name = value?["player6Name"] as? String ?? "" 

     self.playerAmountBeforeTextChanging = value?["numberOfPlayers"] as? String ?? "" 

     self.player1UID = value?["player1UID"] as? String ?? "" 
     self.player2UID = value?["player2UID"] as? String ?? "" 
     self.player3UID = value?["player3UID"] as? String ?? "" 
     self.player4UID = value?["player4UID"] as? String ?? "" 
     self.player5UID = value?["player5UID"] as? String ?? "" 
     self.player6UID = value?["player6UID"] as? String ?? "" 

     if let myNumber = NumberFormatter().number(from: self.playerAmountBeforeTextChanging) { 
      self.numberOFPLayers = myNumber.intValue 
     } else { 
      print("Error converting text into 'int' value!") 
     } 

     print("Transcription: \(self.numberOFPLayers)") 
     print("Player 3 Name: \(self.player3Name)") 
     //HERE: 
     group.leave() 

     // ... 
    }) { (error) in 
     print("DataBase ERROR:\(error.localizedDescription)") 
     //HERE: 
     group.leave() 
    } 
} 
Verwandte Themen