2016-07-10 12 views
0

Ich versuche, Ergebnisse von Firebase zu erhalten und sie in Array zu setzen, aber es scheint, dass ich etwas vermisse. Was ich will, ist es, 'Time' und 'Blood Glucose' Werte von Firebase zu bekommen und sie in ein Array zu setzen, das ich für Charts verwenden werde. Ich kann die Daten in 'BG' und 'TIME' Arrays setzen, aber wenn ich anhängen "sie in‚FetchedDate‘und‚FetchedBG‘ich sehe leere Arrays (FetchedBG und FetchedDate)Wie fügt man Daten aus Firebase korrekt in Array ein?

var FetchedDate:[String]! = [] 
var FetchedBG: [Double]! = [] 

//GET DATA FROM FB 
func GetDetails(){ 
    let posts = rootRef.child("Diary/\(userID!)/\(passedDATE!)") 
    //let posts = rootRef.queryOrderedByChild(passedDATE!) 
    posts.observeEventType(FIRDataEventType.Value , withBlock: { (snapshot) in 

     for list in snapshot.children { 
      if let BG = list.value.objectForKey("Blood Glucose")!.doubleValue { 
      self.FetchedBG.append(BG) 
       print(BG) // SHOWS RESULTS AS EXPECTED 
      } 
      if let TIME = list.value.objectForKey("Time") { 
      self.FetchedDate.append(TIME as! String) 
        print(TIME) // SHOWS RESULTS AS EXPECTED 
      } 
     } 
    }) { (error) in 
     print(error.localizedDescription) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    GetDetails() 

    print(FetchedDate) // EMPTY ARRAY 
    print(FetchedBG) // EMPTY ARRAY 

Antwort

2

Firebase Lasten (und synchronisiert), um die Daten aus Ihrer Datenbank asynchron. Da dies einige Zeit dauern kann, Ihr Code wird weiterhin ausgeführt, und Sie drucken die Arrays, während sie noch leer sind

Sobald ein Wert verfügbar ist (entweder zum ersten Mal oder wenn sich die Daten geändert haben), wird Ihr Block aufgerufen, der die Daten hinzufügt Arrays, aber zu dem Zeitpunkt haben Ihre Print-Anweisungen lang fertig.

Die Lösung besteht darin, den Code zu verschieben, der ausgeführt werden muss, wenn der Wert verfügbar ist (oder wenn er sich geändert hat) in der Block. Z.B.

var FetchedDate:[String]! = [] 
var FetchedBG: [Double]! = [] 

//GET DATA FROM FB 
func StartSynchronizingDetails(){ 
    let posts = rootRef.child("Diary/\(userID!)/\(passedDATE!)") 
    //let posts = rootRef.queryOrderedByChild(passedDATE!) 
    posts.observeEventType(FIRDataEventType.Value , withBlock: { (snapshot) in 

     for list in snapshot.children { 
      if let BG = list.value.objectForKey("Blood Glucose")!.doubleValue { 
      self.FetchedBG.append(BG) 
       print(BG) // SHOWS RESULTS AS EXPECTED 
      } 
      if let TIME = list.value.objectForKey("Time") { 
      self.FetchedDate.append(TIME as! String) 
        print(TIME) // SHOWS RESULTS AS EXPECTED 
      } 
     } 
     print(FetchedDate) 
     print(FetchedBG) 
    }) { (error) in 
     print(error.localizedDescription) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    StartSynchronizingDetails() 

Dies ist ein sehr gemeinsames Muster, wenn Ihre Anwendung mit (möglicherweise zeitaufwendig) Netzwerk-Ressourcen in Wechselwirkung tritt. Es ist auch genau der Grund, warum Firebases observeEventType ein withBlock: Argument verwendet: den Code zu isolieren, der mit dem Code beginnt, der auf Wertupdates reagiert.

+0

Vielen Dank! Jetzt kann ich die Daten in die Tabelle einfügen :) – Deyan

Verwandte Themen