试图从 firebase Swift 获取数据

Posted

技术标签:

【中文标题】试图从 firebase Swift 获取数据【英文标题】:Trying to get data from firebase Swift 【发布时间】:2018-10-24 14:22:42 【问题描述】:

好的,我有一个必须找到平均收视率的函数,所以我将收视率的总量和收视率的总和存储在我的 Firebase 中(效果很好)。我正在尝试检索数据,但似乎它甚至没有输入 .observeSingleEvent 的代码块我在尝试更新值时使用相同的方法,这意味着我得到它们并向它们添加新评级然后我使用下面的代码来更新值:

let ratingObject = [
   "uid" : (user?.uid)! as String,
   "totalRatings" : newRating as Int,
   "amountOfRatings" : newAmountOfRating as int
   ] as [String : Any]

dbRef.setValue(ratingObject)

它没有给出错误,我只是迷路了

我尝试根据本教程进行操作:https://www.youtube.com/watch?v=JV9Oqyle3iE

这个帖子中给出的答案:how parsing Firebase FDatasnapshot json data in swift 只是让应用程序崩溃

private func FindAverage(uid: String) -> Int 

    var totalRatings = 0
    var amountOfRatings = 1
    let dbRef = Database.database().reference().child("ratings").child(uid)

    dbRef.observeSingleEvent(of: .value, with:  snapshot in

        let dict = snapshot.value as? [String:Any]
        totalRatings = dict?["totalRatings"] as? Int ??  0
        amountOfRatings = dict?["amountOfRatings"] as? Int ??  1

    ) (error) in
        print(error.localizedDescription)
    

    return((Int)(totalRatings/amountOfRatings))

数据库结构

非常感谢任何提示和帮助!

【问题讨论】:

【参考方案1】:

您正试图从完成处理程序中返回值。

你的函数应该是这样的:

private func findAverage(byUid uid: String, completion: @escaping (_ average: Int) -> Void) 
    // ...
    dbRef.observeSingleEvent(of: .value, with:  snapshot in
        guard let dict = snapshot.value as? [String: Any] else 
            return
        
        totalRatings = dict["totalRatings"] as? Int ?? 0
        amountOfRatings = dict["amountOfRatings"] as? Int ?? 1

        completion((Int)(totalRatings / amountOfRatings))
    )

类似这样,检查 Swift 文档(关于完成处理程序等)。

【讨论】:

感谢您的回复!效果很好!但对我有用的不是:private func findAverage(byUid uid: String, completion: @escaping (_ average: Int) -> Void),而是private func findAverage(byUid uid: String, completion: @escaping ((_ average: Int?)) -> ()) @DomasG 几乎相同,但可选。很高兴听到,它有帮助。您也可以接受答案:)【参考方案2】:

试试下面的代码:

private func FindAverage(uid: String) -> Int 
  var totalRatings = 0
  var amountOfRatings = 1
  let dbRef = Database.database().reference().child("ratings").child(uid)
  dbRef.observeSingleEvent(of: .value, with:  snapshot in
     if snapshot.exists() 
        guard let dict = snapshot.value as? [String: Any] else 
           return
        
        totalRatings = dict?["totalRatings"] as? Int ??  0
        amountOfRatings = dict?["amountOfRatings"] as? Int ??  1
     
   ) (error) in
      print(error.localizedDescription)
   
   return((Int)(totalRatings/amountOfRatings))

【讨论】:

以上是关于试图从 firebase Swift 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

防止在 Swift 中使用 .childAdded 从 Firebase 获取所有数据

使用 URL (Swift) 从 Firebase 获取数据

Swift 3 从 Firebase 获取用户数据

将 Firebase Firestore 文档值分配给 swift 变量 [重复]

如何从fireBase推送通知swift 4中获取数据

如何从 Firebase 数据库中的 autoID 获取价值 - Swift