【发布时间】:2018-09-14 22:05:09
【问题描述】:
我是 Swift 编程新手,并试图为我的 tableView numberOfSections 返回一个值。我也是完成处理程序的新手。如果我进入调试模式并逐行运行我的代码,count 确实会在 numberOfSections 中“更新”。然而,当它到达 return 语句时,count 仍然是 0。
override func numberOfSections(in tableView: UITableView) -> Int {
var count = 0
let firebase = ref.child("Menu").child("Category").child("Cookies")
getCount(ref: firebase) { (myCount) in
print("Complete")
count = myCount
}
return count
}
func getCount(ref:DatabaseReference, completion: @escaping (Int) -> ()){
var count = 0
ref.observeSingleEvent(of: .value) { (snapshot) in
count = Int(snapshot.childrenCount)
completion(count)
}
}
【问题讨论】:
-
return count不是 after 完成处理程序。您的getCount(ref:completion:)在您的完成处理程序执行之前立即返回。所以,return count被执行,而count仍然是0。在异步操作完成一段时间后,将执行您的完成处理程序{ (myCount) in ... }。通常,您不能在numberOfSections(in:)中使用异步方法。将您的数据模型加载到其他地方并在加载完成时调用tableView.reloadData()。 Sh_Khan 的回答很好地概述了您需要做的事情。 -
你不会想要这样做——它会变得迟钝并且不会为用户提供良好的体验。最佳做法是将要在 tableview 中显示的数据加载到数据源中,然后填充 tableview。计数将来自该数据源,因此它将减少 ping Firebase。 TableViews、collectionViews 等应该由内存中的datasource 支持。然后查看Pagination
标签: swift uitableview firebase