我是 swift 的新手,正在开发我的第一个应用程序。在我的应用程序中,有一个集合视图,我想在其上显示图像。这些图片是从 Firebase 数据库中检索的。
Firebase 数据库的结构如下
{
"CHILD1" : {
"URL1" : "https://Child1_url1.com",
"URL2" : "https://Child1_url2.com",
"URL3" : "https://Child1_url3.com"
}
"CHILD2" : {
"URL1" : "https://Child2_url1.com",
"URL2" : "https://Child2_url2.com",
}
"CHILD3" : {
"URL1" : "https://Child3_url1.com",
}
}
要检索我正在使用以下代码的网址
override func viewDidLoad() {
super.viewDidLoad()
checkSectionCount()
}
func checkSectionCount(){
Database.database().reference().observe(.value) { (snapShot: DataSnapshot) in
let snapDict = snapShot.value as? NSDictionary
let snapCnt = String(snapDict!.count)
print("snapCnt --> (snapCnt)")// This prints the number of child counts correctly
}
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
return snapCnt //I am unable to refer the snapCnt to set the number of section dynamically here
}
如上面的代码所示,我无法从功能checkSectionCount
中引用snapCnt
。我还尝试将此值作为函数参数返回,但是 swift 无法识别snapCnt
Database.database().reference(){ Code
}
不知道我在这里错过了什么。如果有人能指导我如何根据Firebase数据库中可用的详细信息动态设置集合视图的部分和行号,我们将不胜感激。
数据是从 Firebase 异步加载的,因为可能需要一些时间才能从服务器返回数据。主代码不会阻止您的代码(并使应用无响应(,而是继续运行。然后,当代码从服务器返回时,将调用完成处理程序。
如果您更改代码并添加一些日志记录语句,则最容易看到这一点:
print("Before starting to get data")
Database.database().reference().observe(.value) { (snapShot: DataSnapshot) in
print("Got data")
}
print("After starting to get data")
运行此代码时,它会打印:
开始获取数据之前
开始获取数据后
获取数据
这可能不是您期望的顺序,尽管这是正常且记录在案的行为。
因此,任何需要数据库中数据的代码都必须位于完成处理程序中,或者从那里调用。
有关如何处理此问题的更多示例,请参阅:
- 为什么我的从数据库中提取信息的函数不起作用?
- 使用 Swift 在 Firebase 中完成异步任务
- 如何构建代码来处理异步Firebase快照?
- 异步 Swift 调用 数组
- 从异步火力调用返回值的 Swift 函数
好的,借助@Frank共享的链接,我可以解决问题。以下是我采取的方法,对我有用。
步骤 1:使用转义完成处理程序创建 func
func getServiceTypeCount(completion: @escaping (Int) -> Int){
dbRef.child("Services").observeSingleEvent(of: .value) { (serviceDataSnapshot) in
let snapShot = serviceDataSnapshot.value as? [String: Any] ?? [:]
let serviceTypeCount = completion(Int(snapShot.count))
}
}
Step2:在viewDidLoad((中调用此函数
getServiceTypeCount { serviceTypeCount in
self.finalServiceTypeCount = serviceTypeCount
DispatchQueue.main.async {
self.newClassesTableVw.reloadData()
}
return self.finalServiceTypeCount
}
请注意,我已经添加了 DispatchQueue.main.async 来重新加载表。这是为了使用适当的计数值刷新表
步骤3:添加了显示部分的计数值
func numberOfSections(in tableView: UITableView) -> Int {
return self.finalServiceTypeCount
}
希望这有帮助,谢谢。
问候。