【发布时间】:2021-12-10 11:33:29
【问题描述】:
我的应用正在为苹果应用商店分发做准备,我需要做的最后一件事是允许用户阻止另一个用户。我的想法是,在 firebase 上的用户中,会有一个名为被阻止的集合,它会有带有被阻止用户名称的文档,然后每当用户打开个人资料时,应用程序都会检查该个人资料的用户是否被阻止,并且如果他们被阻止,它只会显示一个标题,说明用户被阻止,而不是显示常规的个人资料信息。
以下是将被阻止的用户添加到列表中的代码如下所示:
public func BlockUser(username: String) {
let currentUser = UserDefaults.standard.value(forKey: "username") as! String
let ref = database.collection("users")
.document(currentUser)
.collection("blocked")
.document(username)
ref.setData(["username": username])
}
这很有效,因为这就是 firestore 中显示的内容:
然后做第二部分(检查个人资料用户是否在阻止列表中)我使用以下代码:
public var userIsBlocked: Bool = false
public func IsBlockedByUser(username: String) {
let currentUser = UserDefaults.standard.value(forKey: "username") as! String
let ref = database.collection("users")
.document(currentUser)
.collection("blocked")
.document(username)
ref.getDocument { (document, error) in
if let document = document, document.exists {
self.userIsBlocked = true
} else {
print("Document does not exist")
self.userIsBlocked = false
}
}
}
但是,即使当我打开用户的个人资料时用户在阻止列表中,它仍然会打印“文档不存在。”。我使用谷歌的示例代码来查找文档,为什么没有找到它?
【问题讨论】:
-
我的 Firebase 身份验证仅使用电子邮件和密码。用户名和所有用户的帖子和资料一起存储在 Firestore 中。我不明白为什么用户默认值是存储用户名的坏地方。你能解释一下吗?
-
抱歉,我将用户名与用户 ID 混淆了。但我不太确定我是否会将用户名存储在用户默认值中,因为我认为这不是合适的地方。我会考虑创建一个对象来管理存储用户信息(如用户名)的用户,并监听 Auth 状态的变化。当应用程序启动时,如果用户已登录,则会填充该对象并携带该信息,直到用户退出。不需要在应用的生命周期之外保留这些数据,对吗?
标签: swift firebase google-cloud-firestore