【问题标题】:How can I create a function to check if a user is blocked?如何创建一个函数来检查用户是否被阻止?
【发布时间】: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


【解决方案1】:

我仍然没有看到我之前使用的代码有问题,但我用查询替换了它,这似乎已经解决了这个问题。这是我用来搜索用户是否被阻止的新代码:

public var userIsBlocked: Bool = false

public func UserIsBlocked(username: String) {
    let currentUser = UserDefaults.standard.value(forKey: "username") as! String
    let ref = database.collection("users")
        .document(currentUser)
        .collection("blocked")
    ref.whereField("username", isEqualTo: username)
        .getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
            self.userIsBlocked = false
        } else {
            for document in querySnapshot!.documents {
                print("\(document.documentID) => \(document.data())")
                self.userIsBlocked = true
            }
        }
    }
}


public var blockedByUser: Bool = false

public func IsBlockedByUser(username: String) {
    let currentUser = UserDefaults.standard.value(forKey: "username") as! String
    let ref = database.collection("users")
        .document(currentUser)
        .collection("blockedBy")
    ref.whereField("username", isEqualTo: username)
        .getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
            self.blockedByUser = false
        } else {
            for document in querySnapshot!.documents {
                print("\(document.documentID) => \(document.data())")
                self.blockedByUser = true
            }
        }
    }
}

然后当打开用户的个人资料时,会调用这些函数来检查当前用户是否已阻止他们试图查看其个人资料的用户或已被他们阻止。根据结果​​,将两个变量设置为 true 或 false。如果它们都为假,则加载配置文件,如果其中任何一个为真,则配置文件不会加载并在返回到前一个视图控制器之前显示警报。这段代码到处都是,但它可以完成工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    相关资源
    最近更新 更多