【问题标题】:How retrieve snapshot count using Swift Code如何使用 Swift Code 检索快照计数
【发布时间】:2020-01-24 02:20:34
【问题描述】:

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

}

如上面的代码所示,我无法在 func checkSectionCount 之外引用 snapCnt。我也尝试将此值作为函数参数返回,但是 swift 无法识别出snapCnt

Database.database().reference(){ Code

}

不确定我在这里缺少什么。感谢是否有人可以指导我了解如何根据 Firebase 数据库中提供的详细信息动态设置集合视图的部分和行号。

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database closures


    【解决方案1】:

    数据是从 Firebase 异步加载的,因为它可能需要一些时间才能从服务器返回。主代码不会阻止您的代码(并使应用程序无响应),而是继续运行。然后当代码从服务器返回时,完成处理程序被调用。

    如果您更改代码并添加一些日志记录语句,最容易看到这一点:

    print("Before starting to get data")
    Database.database().reference().observe(.value) { (snapShot: DataSnapshot) in
        print("Got data")
    }
    print("After starting to get data")
    

    当你运行这段代码时,它会打印:

    开始获取数据之前

    开始获取数据后

    得到数据

    这可能不是您所期望的顺序,尽管它是正常且记录在案的行为。

    因此,任何需要数据库数据的代码都必须在完成处理程序中,或者从那里调用。

    有关如何处理此问题的更多示例,请参阅:

    【讨论】:

    • 嗨弗兰克,感谢您分享详细信息。这些链接确实有助于解决问题。
    【解决方案2】:

    好的,借助@Frank 共享的链接,我可以解决问题。以下是我采用的方法,对我有用。

    Step1:使用转义完成处理程序创建 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 以重新加载表。那是用适当的计数值刷新表格

    Step3:将计数值添加到显示部分

    func numberOfSections(in tableView: UITableView) -> Int {
        return self.finalServiceTypeCount
    }
    

    希望对您有所帮助,谢谢。

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2018-08-21
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2019-06-15
      • 2017-12-18
      相关资源
      最近更新 更多