firestore 收集路径给出带有常量值和字符串值的错误

Posted

技术标签:

【中文标题】firestore 收集路径给出带有常量值和字符串值的错误【英文标题】:firestore collection path giving bugs with constants value and String value 【发布时间】:2021-06-06 23:04:32 【问题描述】:

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

我能做的第一件事就是在我的所有查询函数中使用一个字符串插值的集合路径,就像这样:

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

问题是,当我在模拟器上运行应用程序时,我被限制按下按钮,然后有时我可以按下它们,然后有时它们再次受到限制。这个错误非常令人困惑,因为它从哪里出现毫无意义。

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

static let schoolCollectionName = "school_users/\(user?.uid)/events"

这嵌套在Constants 结构内的Firebase 结构中。为了防止 Xcode 出错,我在 Constants 结构之外创建了一个 let users = Auth.auth().currentUser 变量。这个值的问题是,当我把它放在我的所有查询函数集合路径中时,所有按钮都可以随时访问和选择,但是当用户注销并以新用户身份登录时,前一个用户的数据显示在新用户的 tableview 中。

使用Constants 值显然更有意义,因为您可以防止将来出现拼写错误,但我不知道如何摆脱旧用户的数据显示在新用户的表格视图中的错误.提前致谢。

【问题讨论】:

【参考方案1】:

用户 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 中运行您的应用程序并检查 Time Profiler 以查看您是否有长时间运行的任务正在阻塞主/UI 线程。

【讨论】:

看到了,那是我的 Firestore 路径,如果我去掉可选的,该功能将不起作用。文档 ID 的字面意思是 Optional("UserUIDHere")。我更改用户的唯一可靠方法是登录和注销。我不知道guard语句是否是一个合理的添加,当用户登录时,它显示正确用户的电子邮件,但显示错误用户的数据。这类似于my last question that you answered,它是正确的用户,但显示错误的数据。 @jnpdx 另一个问题的问题是有一个authStateListener 闭包巧合地提供了一个user 参数,我可以在我的查询路径中使用它而不是我声明的另一个actualuser 变量。在这种情况下,我认为在这个 tableViewController 中添加另一个 authStateListener 是没有意义的,因为我觉得这只会导致更多的错误。 @jnpdx 嗯——将文档 ID 设为“Optional()”等可能不是一个好主意。如果这还不是生产应用程序,我会改变它。如果您坚持使用它,我会将其硬编码到您的字符串中,而不是依靠 swift 来完成(并忍受 Xcode 错误) 我同意——不要添加另一个 authStateListener 昨晚我确实尝试过更改它,但后来我遇到了错误的访问错误,我不得不检查所有代码才能再次更改。我今晚再试一次。这些按钮在模拟器上出现故障并受到限制,但在我的物理设备上却非常好,我将看看 Instruments and Time Profiler。 @jnpdx

以上是关于firestore 收集路径给出带有常量值和字符串值的错误的主要内容,如果未能解决你的问题,请参考以下文章

带有变量分配的 Java 垃圾收集

Firestore:获取带有和不带有子集合数据的集合[重复]

Firestore 规则 - 动态路径

颤振搜索栏与带有firestore的块

ios:将数据发布到 Firestore 时出现问题

了解 Firestore 收集中的数据何时结束