2016-12-30 31 views
0

レストランとそのデータのリストを取得するために、このコードを以下に示します。しかし、データを格納していないので、配列を返そうとするたびにnilを返します。しかし、私がそれを印刷すると、データを印刷します。助言がありますか?Firebaseからデータを取得できません

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

私はfirebaseの経験がありません。しかし、私が見るところでは、レストランのリストを取得する呼び出しは非同期呼び出しであり、戻り値は '.observe'内のブロックが実行される前に呼び出されるように見えます。その場合は、完了ハンドラブロックを使用して、取得したデータをポストバックします。 [このリンク](http://stackoverflow.com/questions/34121289/return-bool-in-alamofire-closure/34121496#34121496)は助けになるかもしれません。 –

答えて

1

firebase observeは、非同期コールバック関数であるため、終了後に実行されます。つまり、return baruriは値が返される前に常に実行されます。補完ハンドラを使用して、必要な値を取得できます。

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

そのデータを別の場所の変数にどのように格納すればよいですか? let temp = RestaurantData()。getRestaurants() –

関連する問題