试图从 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 获取数据