如何使用 Swift Code 检索快照计数



我是 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
}

希望这有帮助,谢谢。

问候。

相关内容

  • 没有找到相关文章

最新更新