我在使用swift和firebase时遇到了一些麻烦。这是我的问题: 我想从我的firebase数据库中获取一个字符串。所以我把它转换成第5行的int。然后在下一个函数中我想要多次,其中一天是假的我想要获取didntPractiseInt变量并向其添加1。问题是它似乎没有在print语句中添加(在下一行)。
var didntPractiseInt = 0
self.practise?.ref?.observeSingleEvent(of: .value, with: { (snapshot) in
let snapshot = snapshot.value as? NSDictionary
let practised = snapshot?["didntPractiseCounter"] as? String ?? ""
self.didntPractiseInt = Int(practised)!
})
day.ref?.observeSingleEvent(of: .value, with: { (snapshot) in
let snapshot = snapshot.value as? NSDictionary
let practised = snapshot?["practised"] as? String ?? ""
if practised == "false" {
self.didntPractiseInt += 1
print(self.didntPractiseInt)
}
})
// PRINTS 22222
关于print语句的有趣之处在于它打印了适量的false(s)但不是每次都添加它们。
感谢任何贡献者!
我的Firebase数据库:
答案 0 :(得分:0)
第二次通话需要在我的评论第一次通话后发出。 Firebase已经是异步的,为确保按顺序发生事情,需要在Firebase关闭中对其进行处理。所以典型的模式是
addObserver {
receive a valid snapshot {
do something with snapshot data as it's only valid at this point
}
}
此外,我们可以在Swift中完全执行此操作,因为您知道节点名称是什么,所以可以直接访问它们而不是通过NSDictionary。我还包括基本错误检查以捕获nil节点。
var didntPractiseInt = 0
func checkDidntPracticeCount() {
let whichNodeRef = self.ref.child("practice").child("some_node")
let didntPracticeCounterRef = whichNodeRef.child("didntPracticeCounter")
didntPracticeCounterRef.observeSingleEvent(of: .value, with: { snapshot in
if let didntPracticeCount = Int(snapshot.value as! String) {
self.didntPractiseInt = didntPracticeCount
self.checkDidPracticeOnADay()
} else {
print("didntPracticeCounter node not found")
}
})
}
func checkDidPracticeOnADay() {
let whichNodeRef = self.ref.child("practice").child("some_node")
let dayNum = "0"
let whichDayRef = whichNodeRef.child("days").child(dayNum).child("practiced")
whichDayRef.observeSingleEvent(of: .value, with: { snapshot in
if let didPractice = snapshot.value as? String {
if didPractice == "false" {
self.didntPractiseInt += 1
print(self.didntPractiseInt)
} else {
print("did practice on day \(dayNum)")
}
}
})
}
请注意,self.ref指向我的Firebase作为类var。
我还建议使用布尔值而不是“false”和“true”,您可能需要考虑将计数器存储为Int而不是String,因为它们可能更容易用于排序等。
最后,数组在NoSQL数据库中可能是坏消息,它们的使用非常具有情境性。你可能想考虑以其他方式存储你的日子。在这种情况下可能没问题,但请查看Arrays Are Evil。它是2014年的帖子,但仍然非常适用。
修改强>: 我正在考虑这个,并且考虑到你的日子节点总会有7天,可能会有一个更简单的方法。我不知道这是否有帮助,但简单的查询将提供用户在给定的一周内练习的天数。
let daysRef = self.ref.child("practice").child("some_node").child("days")
let query = daysRef.queryOrdered(byChild: "practiced").queryEqual(toValue: "true")
query.observeSingleEvent(of: .value, with: { snapshot in
print(snapshot.childrenCount)
})
如果是这种情况,那么我的答案第一部分中的所有代码都可以替换为此代码。