2016-12-30 10 views
0

Ich habe diesen Code unten, um eine Liste von Restaurants und ihre Daten abzurufen. Es speichert jedoch nicht die Daten und jedes Mal, wenn ich versuche, das Array zurückzugeben, gibt es null zurück. Aber wenn ich es drucke, druckt die Daten. Irgendwelche Vorschläge?Abrufen von Daten aus Firebase funktioniert nicht

func getRestaurants()-> Array<Restaurant>{ 
    var baruri = [Restaurant]() 
    dataBaseRef.child("AthensRestaurants/Restaurants").observe(.value, with: { (snapshot) in 

     if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] { 
      for snap in snapshot { 
       print(snap) 
       if let restaurantData = snap.value as? Dictionary<String, AnyObject> { 
        let restaurant = Restaurant(restaurantData: restaurantData) 
        baruri.append(restaurant) 
        print(baruri) 


       } 
      } 
     } 
    }) 
    return baruri 
} 
+2

Ich habe keine Erfahrung mit Firebase. Aber von dem, was ich sehe, sieht es so aus, als ob der Aufruf zum Abrufen der Liste von Restaurants ein asynchroner Aufruf sein könnte, und die Rückkehr wird aufgerufen, bevor der Block innerhalb von '.observe' ausgeführt wird. Wenn dies der Fall ist, verwenden Sie einen Completion-Handler-Block, um die abgerufenen Daten zurückzugeben. [Dieser Link] (http://stackoverflow.com/questions/34121289/return-bool-in-alamofire-closure/34121496#34121496) könnte eine Hilfe sein. –

Antwort

1

Die Feuerbasis observe ist eine asynchrone Callback-Funktion, so wird es laufen, nachdem es fertig ist. Mit anderen Worten, Ihr return baruri wird immer ausgeführt, bevor der Wert zurückkommt. Sie können den Beendigungshandler verwenden, um den gewünschten Wert zu erhalten.

var restaurants = [Restaurant]() 

func getRestaurants(completion: @escaping (Array<Restaurant>) -> Void){ 
    var baruri = [Restaurant]() 
    dataBaseRef.child("AthensRestaurants/Restaurants").observe(.value, with: { (snapshot) in 

     if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] { 
      for snap in snapshot { 
       print(snap) 
       if let restaurantData = snap.value as? Dictionary<String, AnyObject> { 
        let restaurant = Restaurant(restaurantData: restaurantData) 
        baruri.append(restaurant) 
        print(baruri) 

        completion(baruri) 
       } 
      } 
     } 
    }) 
} 

// Call this function with call back 
getRestaurants { restaurants in 
    self.restaurants = restaurants 
} 
+0

Wie würde ich diese Daten irgendwo anders in einer Variablen speichern? temp = RestaurantData(). getRestaurants() –

Verwandte Themen