首页 > 解决方案 > Firebase 监听喜欢数量的变化并将其显示在屏幕上

问题描述

当用户双击图片时,每个帖子的点赞数(心)都会增加。我试过这段代码,但它没有按预期工作(例如,当我双击时,它会加载一个帖子并用不同数量的喜欢复制它(例如帖子 1-1like、Post 1-2like、Post 1-3like)。如何在不复制帖子的情况下显示更新的点赞数?(帖子 1- 显示 X=Incremental 的点赞数)

func loadPosts() {
let ref = Database.database().reference()
ref.child("posts").observe(.childAdded) { (snapshot: DataSnapshot) in
    if  let dict = snapshot.value as? [String: Any] {
        guard let titleText = dict["title"] as? String else{return}
        let locationDetails = dict["location"] as! String
        let captionText = dict["caption"] as! String
        let photoUrlString = dict["photoUrl"] as! String
        let priceText = dict["price"] as! String
        let categoryText = dict["category"] as! String
        let usernameLabel = dict["username"] as! String
        let profileImageURL = dict["pic"] as! String
        let heartInt = dict["heart"] as! Int
        let timestampString = dict["timestamp"] as! String
        let post = Post(titleText: titleText, captionText: captionText, locationDetails: locationDetails, photoUrlString: photoUrlString, priceText: priceText,categoryText: categoryText, usernameLabel: usernameLabel, profileImageURL: profileImageURL, heartInt: heartInt, timestampString: timestampString)
        //append(post) to array
        self.posts.append(post)
        print(self.posts)
        self.collectionView.reloadData()

    }
}
}

func delayCompletionHandler(completion:@escaping (() -> ())) {
    let delayInSeconds = 0.5
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {
        completion()
    }
}
//CollectionView
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
 cell.reloadEvents = {
    self.delayCompletionHandler {
    self.loadPosts()
    }
}
}

要检测另一个文件中的 heartTapped:

@objc func heartTapped(){
        print(" I heart u")
        let ref = Database.database().reference()
        heartInt1 += 1
        ref.child("posts").child(timestamp).observeSingleEvent(of: .value, with: { (snapshot) in
            if let dic = snapshot.value as? [String : AnyObject]{
                var heartString = dic["heart"] as! Int
                heartString += 1
                ref.child("posts").child(self.timestamp).updateChildValues(["heart" : heartString])
            }
    })
    reloadEvents?()
}
}

标签: iosswiftfirebase

解决方案


您的解决方案是不好的做法。当您处理数据库时,您必须进行大规模思考,如果金卡戴珊每秒获得一颗心使用您的应用程序,那么会发生什么,为每颗心加载和删除所有内容?这听起来有效率吗?

您需要找到一种仅加载红心数量而不是所有内容的方法才能获得红心数量。

一个解决方案是添加一个额外的孩子ref.child("hearts"),然后有一个loadHearts()你会得到心数的地方。


推荐阅读