SwiftUI Firebase-记忆变量



在我的应用程序中,我试图防止用户两次点赞一篇帖子。我当前的代码是:

@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)

目前,当第一次按下类似按钮时,它变为红色;addLike";执行。然而,如果我关闭应用程序并重新打开它,按钮将不再是红色的。无论应用程序关闭/重新打开多少次,我都希望按钮保持红色,直到用户将其按到不同的位置。

我读过关于使用UserDefaults的文章,但这些内容在卸载应用程序时会被清除。我的应用程序链接到了Google Firebase,所以我想当应用程序被点赞时,将用户ID添加到一个名为"的列中;喜欢"y";?然后,当应用程序打开时,让应用程序扫描用户ID,看看该帖子是否已经被他们点赞。我不知道如何实现这一点。

很抱歉,如果这是一个愚蠢的问题,我制作这个应用程序是为了好玩和学习。

编辑由于我在下面标记了答案,我能够部分解决这个问题。我在后台(postData(设置了一个数组:

self.ref.collection("Posts").document(id).updateData([
"likedBy": FieldValue.arrayUnion([self.uid])
self.ref.collection("Posts").document(id).updateData([
"likedBy": FieldValue.arrayRemove([self.uid])

此代码将用户的UID设置为likedBy数组。现在,我需要弄清楚如何读取这些数据,然后查看用户的UID是否等于数组上的UID。

我的新问题:SwiftUI Firebase-读取数组数据以查看字符串是否等于数组字符串

您有两种方法来处理此问题,这两种方法都需要考虑所有可能的情况。选项#1,您可以通过Firebase单独处理。选项#2,您可以在本地处理它并推送到Firebase。您已经提到选项#2的一个问题,卸载会导致数据丢失。显而易见,最好的解决方案是选项#1,我们让Firebase来处理它

选项#1的实施

让我们从逻辑上思考这个问题,用户喜欢一个项目,firebase会更新一个"参考文献";到";张贴ID";(我猜想(。如果应用程序被关闭并重新打开,则没有数据表明帖子被点赞。

为了解决这个问题,我们需要添加一个检查来获取已保存到firebase的数据。如果数据存在,则将其设置为"0";喜欢";如果它没有将其设置为"0";默认";

在你的firebase中,你可能需要这样的文档结构。

user/profiles/<someProfileId>/likedPosts : [ someID, someID2, someID3 ] 

每次应用程序启动时,firebase都会在运行时检查这个特定的文档并获取相关的字典。这样做的目的是#1,它可以简单地获取数据,#2,它可以防止不必要的Firebase查询。然后,您需要将其存储在某个对象中。我建议使用singleton,因为您将需要到处的数据。它可能看起来像这样。

class FirebaseDataManager {
static var shared = FirebaseDataManager()
var likedPosts: [String] //String or Int ID's to the posts themselves.      
init() {
//Fetch our latest liked posts
super.init()
likedPosts = fetchRecentLikedPosts()
}

func fetchRecentLikedPosts() -> [String] {
//Do whatever logic you need to here. 
return [String]()
}
func addLikedPost(postID: String) {
//Add to the likedPosts [String] & Firebase
}
}

这样做会让你有一个";真理之源";作为Firebase,它消除了您在数据不同步或对Firebase进行持续查询时可能遇到的任何问题。要启动,您可以从任何地方访问它。进一步深入研究,每次显示帖子时,请对照FirebaseDataManager.shared.likedPosts数组检查ID,如果有匹配项,您知道它很受欢迎,请相应设置。

用法示例

struct someView: View {

let firManager = FirebaseDataManager.shared
var body: some View { 
//You should handle the case when there is nothing. 
//This is merely an example. 
Text("(firManager.likedPosts.first())"
}
}

文件:https://firebase.google.com/docs/firestore/query-data/get-data

我鼓励您查看关于我在这里提到的一些概念的firebase文档。他们的文档将极大地帮助您。如果你有任何问题,请告诉我,我会尽力帮助你。

最新更新