我使用 Firebase 来存储应用中每个视频的观看次数。我想要的是收集一个用户所有视频的所有观看次数并显示观看总数。但是,我在获取数据并将所有字典值放入 Int/String 中时遇到问题!
到目前为止,我已经尝试了许多不同的解决方案,但我仍然得到了字典中的数组/值等所有不同的值,而不是添加到一个值中的所有值
这是我用于获取特定用户的所有视频 View 的代码,到目前为止没有问题。当我打印“intConvert”时,我得到了不同行中的所有 View 。
<小时/> let ref = Database.database().reference().child("videoviews").child(stringUid)
ref.observe(.value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject]{
let numbOfViews = dictionary["views"] as! String
let intConvert = Int(numbOfViews)!
let ArrayViews = [intConvert]
<小时/>
这是我的数据库结构:
**videoviews**
-Lb52VxrEqdSRGljJdP7
views: "25"
-Lb53ARq_lOHEbTruW8s
views: "273"
-Lb53A_cEyX3CYc4mKYn
views: "38"
<小时/>
编辑:如果我执行 print(dictionary),则“if letdictionary = snapshot.value as? [String: Anyobject] 中的字典如下所示:
["views": 642]
["views": 660]
["views": 628]
["views": 630]
["views": 615]
["views": 3]
["views": 0]
["views": 2]
["views": 1]
<小时/>
编辑:(我很困惑,忘记添加手镯,对此感到抱歉。) 当我这样做时,我“打印(dictionary.values)控制台看起来像这样(来自不同字典的键值):
[642]
[660]
[628]
[630]
[615]
[3]
[0]
[2]
[1]
然后我尝试将其放在一个循环中,如下所示:
<小时/> var bLoader = 0.0
for hejArray in 0...ArreyViews.count-1{
bLoader += Double(Arrej[hejArray])
}
<小时/>
但是当我打印“bLoader”时,我仍然获得不同行中每个视频的所有观看次数,而不是聚集在一个值中。
那么我需要做什么才能将 Firebase 中不同字典中的所有值组合到一个变量中?
我很感激我能得到的所有帮助,我可以想象这应该不会太难,但我错过了一些东西。
编辑///我终于找到了问题所在。我传入的“StringUid”具有不同数量的值,因此如果用户的视频数量为 9,则整个函数将被调用 9 次。最终有效的解决方案如下所示:
全局数组声明:
var myArray = [String]()
函数内部:
if let dictionary = snapshot.value as? [String: AnyObject]{
let numbOfViews = dictionary["views"] as! String
let intConvert = Int(numbOfViews)!
self.myArray.append(numbOfViews)
let intArray = self.myArray.map { Int($0)!}
let total = intArray.reduce(0, +)
self.totalViewsShower2.text = String(total)
提前谢谢您!
最佳答案
更新
如果您可以像这样直接打印字典中的值,那么解决方案可能就像这样简单
let total = dictionary.values.reduce(0, +)
或者如果值是字符串,您需要将它们转换为 Int
let total = dictionary.values.reduce(0) {sum, value -> Int in return sum + (Int(value) ?? 0)}
如果另一方面它们的值是字符串但定义为 Any 你需要额外的转换
let total2 = dictionary2.values.reduce(0) {sum, value -> Int in
if let str = value as? String {
return sum + (Int(str) ?? 0)
}
return 0
}
我不太确定你的字典包含什么,但我假设是这样的
let dictionary: [String: Any] = ["views": ["1", "2", "3"]]
然后,您可以将“views”键的值转换为字符串数组,然后在该数组上使用 reduce
来获取总和
let array = dictionary["views"] as! [String]
let total = array.reduce(0) {sum, value -> Int in return sum + (Int(value) ?? 0)}
关于arrays - 将 firebase 中多个字典中的值添加到 Int 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55460831/