2016-09-02 2 views
0

J'essaye d'analyser les données de Firebase dans un tableau d'objets et, une fois terminé, d'afficher le texte du premier objet du tableau. Cependant, je ne peux pas trouver/trouver une solution pour arrêter le code avant la fin du téléchargement. Ainsi, il met à jour la fin de l'utilisateur à true, sans afficher le texte. Ceci est la fonction est, le téléchargement et annexant à un tableau fonctionne très bien, mais il passe à displayNextInSeries() avant qu'il ne soit terminé ...IOS - Analyse des objets de Firebase - Code en cours d'exécution avant que le téléchargement ne soit terminé

func parseSeries (ref: String) { 
    FIRDatabase.database().reference().child("library").child("series").child(ref).observeSingleEvent(of: .value, with: { (snapshot) in 

     if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] { 

      for snap in snapshot { 

       print(snap) 

       if let pushSeriesDict = snap.value as? Dictionary<String, AnyObject> { 
        let key = snap.key 
        let push = PUSH_SERIES(pushKey: key, pushSeriesData: pushSeriesDict) 
        self.seriesArray.append(push) 

       } 
      } 
     } 
    }) 

    print("\(ref) Series Count: \(self.seriesArray.count)") 
    displayNextInSeries() 

} 

L'écran suivant en fonction de la série voit le seriesArray.count = 0, donc il ne met pas à jour le texLbl:

func displayNextInSeries() { 

    if seriesProgress < seriesArray.count { 

     animateProgress(current: seriesProgress, total: seriesArray.count) 

     currentPUSH_SERIES = seriesArray[seriesProgress] 
     currentPUSH_SERIES.text = personaliseText(text: currentPUSH_SERIES.text) 

     textLbl.animateUpdate(currentPUSH_SERIES.text, oldText: previousText) 
     titleLbl.text = "\(currentPUSH_SERIES.title!)" 
     previousText = currentPUSH_SERIES.text 

     seriesProgress += 1 

    } else { 

     animateProgress(current: sessionProgress, total: sessionTarget) 

     titleLbl.text = "" 
     greetingPush() 
     seriesPlay = false 
     seriesProgress = 0 

     user.updateProgress(seriesName) 
     print(user.progress) 


    } 

} 

Je peux faire quelque chose de fondamentalement faux ici. Votre aide est très nécessaire et très appréciée! Merci, Matt

Répondre

1

Le observeSingleOfEvent est un appel asynchrone, appelant la fonction à l'intérieur du completionBlock va le résoudre, le problème est que la fonction d'impression est appelée avant même observeSingleOfEvent est terminé le téléchargement des données: -

func parseSeries (ref: String) { 
FIRDatabase.database().reference().child("library").child("series").child(ref).observeSingleEvent(of: .value, with: { (snapshot) in 

    if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] { 

     for snap in snapshot { 

      print(snap) 

      if let pushSeriesDict = snap.value as? Dictionary<String, AnyObject> { 
       let key = snap.key 
       let push = PUSH_SERIES(pushKey: key, pushSeriesData: pushSeriesDict) 
       self.seriesArray.append(push) 
       print("\(ref) Series Count: \(self.seriesArray.count)") 
       displayNextInSeries() 
      } 
     } 
    } 
    }) 
} 
+0

Accepter ceci comme réponse si elle a résolu votre problème:) Codage heureux – Dravidian

+0

Merci D. J'ai juste eu besoin de déplacer la fonction displayNext. Merci d'avoir répondu :) –