【问题标题】:SwiftUI Firebase - Reading Array Data to see if string is equal to an array stringSwiftUI Firebase - 读取数组数据以查看字符串是否等于数组字符串
【发布时间】:2021-09-11 08:51:03
【问题描述】:

我正在尝试创建一个功能,如果用户喜欢帖子,关闭应用程序并重新加载应用程序,点赞按钮仍然是红色的,用户将无法再次点赞该帖子,除非他们先不喜欢它。

之前的一篇文章建议我使用数组,这正是我所做的。我创建了一个数组,当一篇文章被点赞时,用户 UID 会转到该数组。数组在“Posts/(postid)”中

现在,我想不通的是如何查看用户 UID 是否等于在此数组中找到的 UID。我的目标是如果用户 UID 已经在数组上,则将变量“isLiked”设置为 true。如果不是,让“isLiked”为假(已经完成)。

PostViewModel.swift

func addLike(id: String){
        ref.collection("Posts").document(id).updateData(["likes": FieldValue.increment(Int64(1))]) { (err) in
            if err != nil{
                print(err!.localizedDescription)
                return
            }
            self.ref.collection("Posts").document(id).updateData([
                "likedBy": FieldValue.arrayUnion([self.uid])
            ])
        }
    }
    
func unLike(id: String){
    ref.collection("Posts").document(id).updateData(["likes": FieldValue.increment(Int64(-1))]) { (err) in
        if err != nil{
            print(err!.localizedDescription)
            return
        }
        self.ref.collection("Posts").document(id).updateData([
            "likedBy": FieldValue.arrayRemove([self.uid])
        ])
    }
}

PostRow.swift

@State private var isLiked = false

HStack {
    Button(action: {if isLiked == false{
        postData.addLike(id: post.id)
        isLiked = true
    } else{
        postData.unLike(id: post.id)
        isLiked = false
    }}, label: {
        Image(systemName: isLiked ? "heart.fill" : "heart")
            .resizable()
            .aspectRatio(contentMode: .fill)
            .frame(width: 20)
            .foregroundColor(isLiked ? .red : .gray)
    })
}

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore swiftui


    【解决方案1】:

    根据您提供的少量代码,很难理解您在做什么。看起来您没有使用 MVVM 作为结构。考虑到有很多事情我会建议你做不同的事情。尽管如此,我可以从您的代码中提取以下更改应该可以解决问题:

    HStack {
        Button(action: {if isLiked == false{
            postData.addLike(id: post.id)
            isLiked = true
        } else{
            postData.unLike(id: post.id)
            isLiked = false
        }}, label: {
            Image(systemName: isLiked ? "heart.fill" : "heart")
                .resizable()
                .aspectRatio(contentMode: .fill)
                .frame(width: 20)
                .foregroundColor(isLiked ? .red : .gray)
        }).onAppear(perform: self.isLiked = self.model.checkForLikes(id: post.id)) // update State 
    }
    
    
    class PostViewModel {
        // func addLike
            
        // func unLike
        
        func checkForLikes(id: String) -> Bool { // Add this method
            let doc = ref.collection("Posts").document(id)
            
            return doc.whereField("likedBy", arrayContains: self.uid)
        }
        
    }
    

    以下是有关如何在 Firebase 中查询的更多信息: Firebase Queries

    【讨论】:

    • 我还推荐易于使用的Real Time Updates。为此,我在您的代码中看到的内容需要进行相当多的返工,但这意味着您可以实时实现视觉更新,而无需“关闭应用程序并重新加载应用程序”
    • 对不起,我应该提供我的代码。是的,我的项目设置为 MVVM。稍后我会看一下这段代码,如果我有任何问题,请告诉你。谢谢!
    • 好吧,在 let doc 末尾添加“.document(id)”是不正确的。这显然是不允许的。删除它后,我不断收到错误消息“无法将 'Query' 的值转换为预期的条件类型 'Bool'”。
    • 能否提供所有必要的代码?仅使用一些结构和功能就很困难,因为愿意回答您的问题的人必须花费额外的时间来获取所有需要的参数等。请参阅Minimal reproducible example
    猜你喜欢
    • 2021-06-04
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多