Swift:如何对从Firestore数据库获取的文档按日期排序?
按日期排序Firestore文档的两种方案
方案1:Firestore服务器端排序(推荐)
直接在Firestore查询阶段指定排序规则,返回的结果会直接按日期排好序,无需客户端额外处理,效率更高。
修改EncontradoService中的get方法,在collection调用后添加排序规则:
class EncontradoService { let database = Firestore.firestore() func get(collectionID: String, handler: @escaping ([Encontrado]) -> Void) { database.collection("EncontradosFinal") .order(by: "date") // 默认升序(旧日期在前) // 若需降序(新日期在前),改为:.order(by: "date", descending: true) .addSnapshotListener { querySnapshot, err in if let error = err { print(error) handler([]) } else { handler(Encontrado.build(from: querySnapshot?.documents ?? [])) } } } }
方案2:客户端本地排序
如果需要在客户端处理排序,可以在获取数据后调用sorted(by:)方法,有两个常用位置可选:
位置A:数据回调中直接排序
修改TableViewController的loadData方法,给allencontrados赋值时完成排序:
func loadData() { service = EncontradoService() service?.get(collectionID: "EncontradosFinal") { encontrados in // 按日期降序排序(新日期在前),升序则替换为 $0.date < $1.date self.allencontrados = encontrados.sorted { $0.date > $1.date } } }
位置B:属性观察器中自动排序
若希望每次allencontrados更新都自动排序,修改它的didSet观察器:
private var allencontrados = [Encontrado]() { didSet { DispatchQueue.main.async { // 排序后再赋值给encontrados self.encontrados = self.allencontrados.sorted { $0.date > $1.date } } } }
注意事项
- 确保
Encontrado模型的date字段类型为Date(建议Firestore中存储为Timestamp类型,再转成Swift的Date,避免字符串排序的逻辑错误)。 - 服务器端排序时,若数据量较大,Firestore控制台会提示你为
date字段创建索引,按照提示操作即可。
内容的提问来源于stack exchange,提问作者Patricio
相关产品推荐
相关产品推荐

