Ios firestore收集路径提供带有常量值和字符串值的bug

Ios firestore收集路径提供带有常量值和字符串值的bug,ios,swift,firebase,struct,google-cloud-firestore,Ios,Swift,Firebase,Struct,Google Cloud Firestore,所以我的目标是彻底消除这些bug。我进退两难,每个决定都会导致一个错误 最终成为问题的第一件事是在所有查询函数中使用字符串插值收集路径,如下所示: func getEventName() { listener = db.collection("school_users/\(user?.uid)/events").order(by: "time_created", descending: true).addSnapshotListener(inclu

所以我的目标是彻底消除这些bug。我进退两难,每个决定都会导致一个错误

最终成为问题的第一件事是在所有查询函数中使用字符串插值收集路径,如下所示:

func getEventName() {
    listener = db.collection("school_users/\(user?.uid)/events").order(by: "time_created", descending: true).addSnapshotListener(includeMetadataChanges: true) { (querySnapshot, error) in
        if let error = error {
            print("There was an error fetching the data: \(error)")
        } else {
            self.events = querySnapshot!.documents.map { document in
                return EventName(eventName: (document.get("event_name") as! String))
            }
            self.tableView.reloadData()
        } 
    }
}
问题是,当我在模拟器上运行应用程序时,我被限制按下按钮,有时我可以按下按钮,有时它们会再次受到限制。这个bug非常混乱,因为它从何而来毫无意义

另一个问题是,我可以在我的集合路径中的所有查询函数中使用
Constants

static let schoolCollectionName = "school_users/\(user?.uid)/events"
这嵌套在
常量
结构中的
Firebase
结构中。为了防止Xcode出现错误,我在
常量
结构之外创建了一个
let users=Auth.Auth().currentUser
变量。该值的问题在于,当我将其放入所有查询函数集合路径中时,所有按钮都可以随时访问和选择,但当用户注销并且我作为新用户登录时,新用户的tableview中会显示以前用户的数据


显然,使用
常量
值更有意义,因为这样可以防止将来出现打字错误,但我不知道如何消除旧用户的数据显示在新用户的tableview中的错误。提前感谢。

用户id绝对应该不是一个常量。这听起来像是,现在,你没有可靠的方法来更改用户——你的设置可能取决于哪个用户在应用程序启动时登录,因为这是你的变量设置的地方

我会做更像这样的事情:

func getEventName() {
    guard let user = Auth.auth().currentUser else {
       //handle the fact that you don't have a user here -- don't go on to the next query
       return
    }
    listener = db.collection("school_users/\(user.uid)/events").order(by: "time_created", descending: true).addSnapshotListener(includeMetadataChanges: true) { (querySnapshot, error) in
      
请注意,现在,插值路径中的
user.uid
没有用于选择性地展开它的
(Xcode现在给您一个警告)。它还将保证始终对当前登录的用户进行正确的查询


关于能够按下按钮,这听起来像是一个无关的问题。您可以在Instruments中运行应用程序,并检查时间分析器,以查看是否有长时间运行的任务正在破坏主/UI线程。

用户id肯定应该而不是一个常量。这听起来像是,现在,你没有可靠的方法来更改用户——你的设置可能取决于哪个用户在应用程序启动时登录,因为这是你的变量设置的地方

我会做更像这样的事情:

func getEventName() {
    guard let user = Auth.auth().currentUser else {
       //handle the fact that you don't have a user here -- don't go on to the next query
       return
    }
    listener = db.collection("school_users/\(user.uid)/events").order(by: "time_created", descending: true).addSnapshotListener(includeMetadataChanges: true) { (querySnapshot, error) in
      
请注意,现在,插值路径中的
user.uid
没有用于选择性地展开它的
(Xcode现在给您一个警告)。它还将保证始终对当前登录的用户进行正确的查询


关于能够按下按钮,这听起来像是一个无关的问题。你可以在Instruments中运行你的应用程序,并检查时间分析器,看看你是否有长时间运行的任务正在破坏主/UI线程。

看,这就是问题所在,这就是我的Firestore路径,如果我去掉可选的,该功能将无法工作。文档ID实际上是
可选(“UserUIDHere”)
。我更改用户的唯一可靠方法是登录和注销。我不知道guard语句是否是合理的添加,当用户登录时,它显示正确用户的电子邮件,但显示错误用户的数据。这类似于它是正确的用户,但显示错误的数据@JNPDX另一个问题的问题是,有一个
authStateListener
闭包恰好提供了一个
user
参数,我可以在查询路径中使用它,而不是我声明的另一个
actualuser
变量。在这种情况下,我认为在tableViewController中添加另一个
authStateListener
是没有意义的,因为我觉得这只会导致更多的bug@jnpdxHmm——将文档ID设为“Optional()”等可能不是一个好主意。如果这不是一个生产应用程序,我会改变它。如果你被它困住了,我会把它硬编码到你的字符串中,而不是依靠swift来完成(并忍受Xcode错误)。我同意——不要添加另一个AuthStateListener我昨晚确实尝试过更改它,但后来我遇到了一个糟糕的访问错误,我不得不检查所有代码,以便再次更改。我今晚再试一次。按钮的行为有缺陷,在模拟器上受到限制,但在我的物理设备上非常好,我来看看仪器和时间分析器@jnpdxSee就是这样,这是我的Firestore路径,如果我去掉可选的,函数将无法工作。文档ID实际上是
可选(“UserUIDHere”)
。我更改用户的唯一可靠方法是登录和注销。我不知道guard语句是否是合理的添加,当用户登录时,它显示正确用户的电子邮件,但显示错误用户的数据。这类似于它是正确的用户,但显示错误的数据@JNPDX另一个问题的问题是,有一个
authStateListener
闭包恰好提供了一个
user
参数,我可以在查询路径中使用它,而不是我声明的另一个
actualuser
变量。在这种情况下,我认为在tableViewController中添加另一个
authStateListener
是没有意义的,因为我觉得这只会导致更多的bug@jnpdxHmm——将文档ID设为“Optional()”等可能不是一个好主意。如果这不是一个生产应用程序,我会改变它。如果你被它困住了,我会把它硬编码到你的字符串中,而不是依靠swift来完成(并且忍受着Xcode错误),我同意——不要再添加一个AuthStateListener我昨晚确实尝试过更改它,但后来我遇到了一个糟糕的访问错误,我