swift - FirebaseDatabase runTransaction 块问题
问题描述
我正在努力FirebaseDatabase
更新runTransactionBlock
. 这个块应该增加likesCount
和recordsCount
。最初,当发布帖子时,这些设置为 0。因此,我正在检查是否likesCount == 0
,如果是,则这意味着这是帖子的第一个类似,因此它只需likes
使用 userUid 和值设置数组true
在单独的节点中。然后在这个节点中增加likesCount
and并更新它们的值。第一次,这行得通。它设置了它们的值。recordsCount
runTransactionBlock
func incrementLikes(postId: String, onSuccess: @escaping (Post) -> Void, onError: @escaping (_ errorMessage: String?) -> Void) {
let postRef = Api.Post.REF_POSTS.child(postId)
postRef.runTransactionBlock({ (currentData) -> TransactionResult in
if var post = currentData.value as? [String : AnyObject] {
var likesCount = post["likesCount"] as? Int ?? 0
var recordsCount = post["recordsCount"] as? Int ?? 0
if likesCount == 0 { // First like for the post
// add self in posts_likes > postId > likes
// increment likes count & increment records Count
Api.Posts_Likes.firstPostsLikes(postId: postId)
likesCount += 1
recordsCount += 1
}
else {
Api.Posts_Likes.setPostsLikes(postId: postId, onSuccess: { (isPostLiked) in // checks if user liked the post or not, if he did, his id was added in posts_likes > likes
if isPostLiked {
likesCount += 1
recordsCount += 1
}
else {
likesCount -= 1
recordsCount -= 1
}
}, onError: { (errMessage) in
onError(errMessage)
})
}
post["recordsCount"] = recordsCount as AnyObject?
post["likesCount"] = likesCount as AnyObject?
currentData.value = post
return TransactionResult.success(withValue: currentData)
}
return TransactionResult.success(withValue: currentData)
})
{ (error, committed, snapshot) in
if let error = error {
onError(error.localizedDescription)
}
if let dict = snapshot?.value as? [String: Any] {
let post = Post.transformDataToImagePost(dictionary: dict, key: snapshot!.key)
onSuccess(post)
}
}
}
当用户再次单击该按钮时,它将进入else
语句,因为likesCount
不再等于0
。这是它不起作用的地方。当Api.Posts_Likes.setPostsLikes(postId: postId, onSuccess:)
被调用时,它应该返回一个Bool
值,无论用户是否喜欢或不喜欢该帖子。基于该bool
值,它应该increment
或节点中decrement
的likesCount
& 。但它没有,我不明白为什么。recordsCount
posts
func firstPostsLikes(postId: String) {
guard let currentUser = Api.Users.CURRENT_USER else { return }
REF_POSTS_LIKES.child(postId).child("likes").child(currentUser.uid).setValue(true)
}
func setPostsLikes(postId: String, onSuccess: @escaping (Bool) -> Void, onError: @escaping (_ errorMessage: String?) -> Void) {
let postLikesRef = Api.Posts_Likes.REF_POSTS_LIKES.child(postId)
guard let currentUser = Api.Users.CURRENT_USER else { return }
var userLikedPost: Bool = false
postLikesRef.runTransactionBlock ({ (currentPostsLikesData) -> TransactionResult in
if var postLikes = currentPostsLikesData.value as? [String : AnyObject] {
var likes = postLikes["likes"] as? [String : Bool] ?? [:]
if let _ = likes[currentUser.uid] {
// Unlike the post and remove self from likes
likes.removeValue(forKey: currentUser.uid)
userLikedPost = false
}
else {
// Like the post, add self to posts_likes, increase likesCount & recordsCount
likes[currentUser.uid] = true
userLikedPost = true
}
postLikes["likes"] = likes as AnyObject
currentPostsLikesData.value = postLikes
return TransactionResult.success(withValue: currentPostsLikesData)
}
return TransactionResult.success(withValue: currentPostsLikesData)
})
{ (error, committed, snapshot) in
if let error = error {
onError(error.localizedDescription)
}
onSuccess(userLikedPost)
}
这是看起来的FirebaseDatabase
样子:
recordsCount
节点中的是、和的posts
总和。在单元格中加载新内容时,我唯一需要显示的是. 这就是为什么我不想把所有喜欢、鼓掌、评论等的数组放在帖子本身下面,因为它会免费下载大量数据,除非用户点击按钮来实际commentsCount
likesCount
repostsCount
applaudsCount
post
recordsCount
recordsCount
解决方案
推荐阅读
- sql-server - 登录 Microsoft SQL Server 错误:18456_远程访问
- node.js - 邮递员未到达 AWS EKS API 终端节点
- flutter - Flutter DropDownButton 更改页面正文
- excel - 使用最后一行仅粘贴值和数字格式
- java - 场景执行状态########## ---->>>> UNDEFINED 错误
- string - 使用 bat 中的断线将多个字符串打印到文件中
- linux - Linux CLI,使用 var 与管道回显
- javascript - 如何加载本地geojson文件并将其显示在asp.net mvc的传单地图上?
- c# - Service Fabric 内的多线程 .NET 应用程序抛出“发出 HttpWebRequests 时操作已计时”
- r - 将概率边界添加到 pdp::partial plot