尝试通过递归从Firebase加载时出错

时间:2017-03-27 17:53:43

标签: ios swift firebase firebase-realtime-database

我一直在尝试加载一系列我想要放在不同表视图单元格上的团队名称,但它似乎永远不会正确加载它们。

我一直试图让程序等到它返回值,但它似乎永远不会得到任何,因为它总是崩溃,得到加载错误,或者只是冻结。

    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循环/递归函数已经非常麻烦。

非常感谢!

2 个答案:

答案 0 :(得分: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()
    })

}

答案 1 :(得分:0)

curl -x