2016-12-31 13 views
-1

現在Firebaseを使用していて、ノード内の子の数のカウントを取得して、UITableViewControllerのセクションの行を決定しようとしています。しかし、呼び出しが非同期であるため、外部に正しく保存されません。Swift - 非同期呼び出し(Firebase)に割り当てられた戻り値

注:データ・ベースの子の数である "count"という値を割り当てましたが、実際に子を数える関数も非同期です。ここで

は私のコードです:ここでは

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    let userID = FIRAuth.auth()?.currentUser?.uid 
    ref = FIRDatabase.database().reference() 
    var count = 0 
    if section == 0 { 
     ref.child("users").child("merchants").child(userID!).child("menu").child(spirits[section]).observeSingleEvent(of: .value, with: { (snapshot) in 
      let value = snapshot.value as? NSDictionary 
      let count = value?["count"] as? Int 
      print("count in: ", count!) 
     }) 
     print("count out: ", count) 
    } else { 
     count = 0 
    } 
    return count 
} 

が出力されます。

はアウトカウント:0 はアウトカウント:0 はアウトカウント:0 はアウトカウント:0 はアウトカウント:0 を数:1 件数:1 件数:1 件数:1 件数:1

Output

ディスパッチまたは完了コードの説明を試みた複数のスタックオーバーフローに関する質問を検索しましたが、何もできませんでした。私のカウントを適切に返すにはどうすればよいですか?

答えて

0

numberOf...テーブルビューのデータソースメソッドのいずれかにデータをロードすることは絶対にしないでください。 viewDidLoadまたはviewWillAppearにデータを取得し、テーブルビューでreloadData()を呼び出します。

numberOfRowsInSectionでは、モデル(データソース配列)の項目数を返します。

テーブルビューのデータソースとデリゲートメソッドを適切に使用する方法は数多くあります。

関連する問題