【发布时间】:2021-06-22 13:31:19
【问题描述】:
我有一种情况,我错误地阻止了我的 firebase 规则写入 ref,当我运行下面的代码时,“值无法更新,请重试” 打印超过 20 倍.我现在这样做的方式是事务不断尝试直到成功,但是在我刚刚遇到的情况下,如果它不成功,事务将永远运行。
我想知道如果事务失败,是否有内置方法可以运行最大尝试次数?
func runTransaction(on userId: String) {
self.followButton.isEnabled = false
let followersPath = Database.database().reference()
.child("users")
.child(userId)
.child("followersCount")
followersPath.runTransactionBlock({ (mutableData: MutableData) -> TransactionResult in
var currentCount = mutableData.value as? Int ?? 0
mutableData.value = currentCount + 1
return TransactionResult.success(withValue: mutableData)
}, andCompletionBlock: { (error, completion, snap) in
if !completion || (error != nil) {
print("The value wasn't able to update, try again")
self.runTransaction(on: userId)
return
}
print("The value updated")
let totalFollowersCount = snap?.value as? Int ?? 0
self.myCellWithTheUserId.followersCount = totalFollowersCount
self.followButton.isEnabled = true
})
}
【问题讨论】:
-
self.runTransaction(on: postId)失败时这是什么情况?它会自动再次尝试事务直到超时。 -
就是这样,我设置它的方式没有超时,它会继续尝试。当我第一次注意到这个问题时,它一直在继续并且没有停止,因为由于不正确的规则,它永远不会成功。我不得不关闭 XCode。有内置的超时功能吗?
-
你是说我不需要添加那行,它会继续自己尝试吗?我不知道。我以为一旦失败就可以了
-
不。它重试;见Transactions 如果事务被拒绝,服务器将当前值返回给客户端,客户端使用更新的值再次运行事务。这种情况会一直重复,直到交易被接受或尝试次数过多。如果您需要中止交易,您可以在闭包内
return TransactionResult.abort()。 -
哦,谢谢伙计!我不知道它会自己尝试。我在 5 个差异项目中有相同的代码。我必须进行一些严肃的更新。您可以将此添加为答案,以便帮助下一个人吗?我有一个快速的问题。我没有在问题中包含这个,但是如果它成功,我有一些代码可以运行,它会进入我的 else 语句中。如果我摆脱 else 语句,添加我的成功代码,如果它失败,它仍然会运行,我是否需要担心它会再次运行我的函数,还是会在后端自行尝试?基本上我不希望成功代码运行两次。
标签: ios swift firebase firebase-realtime-database