Swift - 在异步调用中分配的返回值(Firebase)

时间:2016-12-31 18:44:58

标签: ios swift asynchronous firebase return

我目前正在使用Firebase并尝试获取节点中子节点数的计数,以确定UITableViewController部分的行数。但是由于呼叫是异步的,因此无法在外部正确保存。

注意:我分配了一个名为" count"在datatbase中是子节点数,但实际计算子节点的函数也是异步。

这是我的代码:

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

我已经搜索了多个堆栈溢出问题,试图解释调度或完成代码,我无法得到任何工作。我怎样才能让我的计数正确归还?

1 个答案:

答案 0 :(得分:0)

永远不要在numberOf...表视图数据源方法之一中加载数据。获取viewDidLoadviewWillAppear中的数据,然后在表格视图中调用reloadData()

numberOfRowsInSection中,只返回模型中的项目数(数据源数组)。

有无数的例子如何正确使用表视图数据源和委托方法。