从 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