从 tableView 中的 Firestore 单元格读取数据后随机重新排序

Posted

技术标签:

【中文标题】从 tableView 中的 Firestore 单元格读取数据后随机重新排序【英文标题】:After reading data from Firestore cells in tableView randomly reorder 【发布时间】:2020-06-22 00:53:10 【问题描述】:

我正在开发根据 ID 打印已访问地点名称的应用程序。我将数据存储在几个名为“placesExploredByUsers/userID”的节点中,该节点存储有关用户之前访问过的地点 ID 的数据,节点“databaseOfPlaces”存储所有地点 ID 以及附加信息(名称、位置、坐标等),所以它就像 SQL 中的外键一样工作。我的所有数据都存储在 Firebase 中。

但是,我在 Swift 的 tableView 中排序我的单元格时遇到了问题。我尝试了几个选项,这是我最后一次修改。问题是,每次我使用 tableView 来到 viewController 时,我的单元格都会随机重新排序。

这是函数,应该处理它。

谁能帮帮我?提前致谢

   func getDataToTable()
    // setting the firebase reference
    ref = Database.database().reference()
    let userID = (Auth.auth().currentUser?.uid)!
    
    // getting information about places that user has visited
    Database.database().reference().child("placesExploredByUsers").child(userID).queryOrderedByValue().observeSingleEvent(of: .value)  (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject]
            
            // creating array of all ID of places that user has visited
            let idsOfAllPlaces = Array(dictionary.keys)
            
            for id in idsOfAllPlaces  
                
                // getting information about places from database of ID of all places that are in app
                Database.database().reference().child("databaseOfPlaces").child(id).queryOrderedByValue().observeSingleEvent(of: .value)  (snapshot1) in
                    if let dictionary = snapshot1.value as? [String: AnyObject]
                        // getting information about name
                        self.random = dictionary["name"]! as! String
                        // updating the table view
                        self.postData.append(self.random)
                        self.sortedList(array: self.postData)
                    
                
                
            
            
        
 
    

【问题讨论】:

【参考方案1】:

根据文档

默认情况下,查询检索所有满足查询的文档 按文档 ID 升序排列。您可以指定排序顺序 你的数据使用 orderBy(),你可以限制文档的数量 使用 limit() 检索。 注意:orderBy() 子句还过滤给定字段的存在。结果集将不包括不包含给定字段的文档。

所以使用order(by: "databaseOfPlaces")

func getDataToTable()
    // setting the firebase reference
    ref = Database.database().reference()
    let userID = (Auth.auth().currentUser?.uid)!
    
    // getting information about places that user has visited
    Database.database().reference().child("placesExploredByUsers").child(userID).order(by: "databaseOfPlaces").observeSingleEvent(of: .value)  (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject]
            
            // creating array of all ID of places that user has visited
            let idsOfAllPlaces = Array(dictionary.keys)
            
            for id in idsOfAllPlaces  
                
                // getting information about places from database of ID of all places that are in app
                Database.database().reference().child("databaseOfPlaces").child(id).queryOrderedByValue().observeSingleEvent(of: .value)  (snapshot1) in
                    if let dictionary = snapshot1.value as? [String: AnyObject]
                        // getting information about name
                        self.random = dictionary["name"]! as! String
                        // updating the table view
                        self.postData.append(self.random)
                        self.sortedList(array: self.postData)
                    
                
                
            
            
        
 
    

【讨论】:

感谢您的尽快答复。但是,我尝试实现这一点,但没有成功,因为我在 firebase 文档中没有找到任何关于 .order(by: ) 的信息。我试过使用 .queryOrdered(byChild: "databaseOfPlaces") 但结果是一样的。【参考方案2】:

问题是你调用snapshot1.value as? [String: AnyObject],这意味着顺序丢失了(因为字典中的项目没有定义的顺序)。

要按您请求的顺序处理结果,请遍历 snapshot1.children。比如:

for snap in snap1.children.allObjects as! [DataSnapshot] 
    self.random = snap.value["name"]! as! String
    self.postData.append(self.random)
    self.sortedList(array: self.postData)

另见:

Firebase getting data in order ios - Firebase Filter query How to properly use queryOrderedByValue

【讨论】:

感谢您的回答。但是我无法实现您的 2. 行,因为我收到错误“'Any 类型的值?'没有下标”。所以我检查了你的旧帖子,发现了这样的内容:让 value = snapshot1.value as! NSDictionary self.random = value["name"] as!细绳 ?? “”(其余与您推荐的相同)但是 1. 数据重复多次 2. 由于某种原因,顺序再次随机化。 1) 你能重复给出错误信息的那一行吗? 2) 正如我在第一行中解释的那样,致电snapshot1.value 是您丢失订单的全部原因。 嗨,对不起,我忘了回复。我使用 Firestore 数据库而不是实时数据库。我使用方法 .order() 获取信息,然后使用以下方法对数组进行排序: self.postData = self.postData.sorted $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending 按字母顺序对其进行排序。非常感谢您的帮助和兴趣:)

以上是关于从 tableView 中的 Firestore 单元格读取数据后随机重新排序的主要内容,如果未能解决你的问题,请参考以下文章

当我们从 FireStore 检索数据时,tableview.reloaddata() 在 Dispatchqueue.main.sync 之外仍然有效

尝试搜索 Firestore 并重新加载 tableview 时出现 SearchBar 问题

带有firestore数组的tableview swift uikit

有没有办法用数组构造一个 Firestore 字段(同名)并显示 TableView 中每个字段的每个数组元素

我的tableview单元格上的组件不可见

在iOS中使用Firebase / Firestore填充tableView时遇到麻烦