2017-03-27 10 views
1

異なるテーブルビューのセルに配置したいチーム名の配列を読み込もうとしましたが、Firebaseから再帰を使用してロードしようとするとエラーが発生する

私は、値が戻ってくるまでプログラムを待たせようとしていますが、常にクラッシュしたり、読み込みエラーを取得したり、フリーズしたりするので、何も得られないようです。

var ref: FIRDatabaseReference? 
    var teamData = [String]() 
    var teamCount : Int? 
    var hasfilled = false 
    var firstRun = false 
    var currentUser = FIRAuth.auth()?.currentUser 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.delegate = self 
     tableView.dataSource = self 
     ref = FIRDatabase.database().reference() 

     //Load each team 
     let path = ref?.child("Users").child(currentUser!.uid).child("joinedTeams") 
     path?.observeSingleEvent(of: .value, with: { (snapshot) in 
      let enumerator = snapshot.children 
      while let rest = enumerator.nextObject() as? FIRDataSnapshot{ 
       let teamName = rest.value as? String 
       if let teamNameData = teamName { 
        self.teamData.append(teamNameData) 
       } 
      } 
      self.teamCount = Int(snapshot.childrenCount) 
     }) 
     if runTillCompletion() == true { 
      self.tableView.reloadData() 
     } 
    } 

    func runTillCompletion() -> Bool{ 
     if self.teamCount == self.teamData.count { 
      return true 
     } 

     return runTillCompletion() 
    } 

私はこれをいくつかの方法で試しました。whileループからちょうどトンを読み込んでいます。

ビューを再読み込みして、セルのセル数/コンテンツ数を決定するテーブルビューメソッドを実行します。

whileループ/再帰関数を使用すると厄介な問題が発生しているので、これを行うにはより良い方法があると確信しています。

ありがとうございます!

答えて

1

あなたのrunTillCompletionメソッドはFirebaseからの応答の前に先に呼び出され、したがってtableviewは空です。 firebaseからデータを取得した後、テーブルをリロードする必要があります。

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.delegate = self 
    tableView.dataSource = self 
    ref = FIRDatabase.database().reference() 

    //Load each team 
    let path = ref?.child("Users").child(currentUser!.uid).child("joinedTeams") 
    path?.observeSingleEvent(of: .value, with: { (snapshot) in 
     let enumerator = snapshot.children 
     while let rest = enumerator.nextObject() as? FIRDataSnapshot{ 
      let teamName = rest.value as? String 
      if let teamNameData = teamName { 
       self.teamData.append(teamNameData) 
      } 
     } 
     self.teamCount = Int(snapshot.childrenCount) 
     self.tableView.reloadData() 
    }) 

} 
0
FIRDatabase.database().reference(withPath: "users/\(currentUser!.uid)/joinedTeams") 
    .observeSingleEvent(of: .value, with: { (snapshot) in 

     if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] { 
      self.teamData = snapshots.flatMap { $0.value as? String } 
      self.tableView.reloadData() 
     } 
    } 
) 
+0

これを試しました。それは凍結せずにテーブルビューにセグを管理するが、それは何もロードされませんクラッシュします。私は観測の最後にブレークポイントを置いて、self.teamCountとself.teamDataの両方が空です。 –

+0

観測終了時にはどういう意味ですか? 'observeSingleEvent(of:...、with:'ブロック内にブレークポイントを置く必要があります。あなたの質問に 'UITableViewDataSource'メソッドを追加してください – Callam

関連する問題