gpt4 book ai didi

Swift:如何在向 Firebase 变量添加值时修复无限循环

转载 作者:搜寻专家 更新时间:2023-11-01 05:56:52 27 4
gpt4 key购买 nike

我的程序中有这段代码应该允许用户点击一条消息并且分数应该增加一:

super.collectionView(collectionView, didTapMessageBubbleAtIndexPath: indexPath)
let data = self.messages[indexPath.row]

print("They tapped: " + (data.text) + "- " + (data.senderDisplayName))

let rootRef : FIRDatabaseReference = FIRDatabase.database().reference()
let senderID = FIRAuth.auth()!.currentUser!.uid

rootRef.child("messages").observeEventType(.Value, withBlock: { (snap) in

print(senderID)

if snap.exists(){
if let messagesDict = snap.value! as? [String : AnyObject]
{
for each in messagesDict as [String : AnyObject]{

let postID = each.0
if let messageDict = each.1 as? [String:AnyObject]{
if senderID == messageDict["senderId"] as! String{

//Checking for the senderID of the user so that you only increment the score of that particular message post
var userScore = messageDict["score"] as! Int
userScore = userScore + 1
rootRef.child("messages").child(postID).child("score").setValue(userScore)

print(senderID)
print(messageDict["senderId"])
print(userScore)
}
}
}
}
}
})

但是,当运行上述代码并且用户点击一条消息时,分数变量在 Firebase 中确实会增加,但它永远不会停止运行。这会导致分数无限增加,这不是我想要的。我希望我的代码一次只将分数加一,但这似乎不起作用。任何人都可以帮助我找到我的无限循环或建议我可以更有效地添加到 Firebase 中的分数变量的方法吗?

谢谢!

附言我还知道一个事实,即该函数本身不会运行多次,因为打印语句:print("They tapped: "+ (data.text) + "- "+ (data.senderDisplayName)) 只打印一次,并返回正确的数据。

最佳答案

Ivan 的回答将解决您当前遇到的问题。但是从服务器加载所有消息以检测用户点击了哪一条消息听起来可能会浪费大量带宽。

如果您要向用户显示来自 Firebase 的消息列表,我建议您跟踪每条消息的键。有了这些信息,您就不必扫描所有消息,而是可以直接查找被点击的消息并通过交易增加其分数:

rootRef.child("messages").child(postID).child("score").runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in
// Set value and report transaction success
currentData.value = currentData.value + 1
return FIRTransactionResult.successWithValue(currentData)
}) { (error, committed, snapshot) in
if let error = error {
print(error.localizedDescription)
}
}

交易还将解决您现在拥有的潜在竞争条件:如果两个用户几乎同时单击同一条消息,一个可能会覆盖另一个的分数增量。

关于Swift:如何在向 Firebase 变量添加值时修复无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39013626/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com