SwiftUI中如何按日期/时间顺序显示Firebase中的数组数据?
看起来你已经在尝试用Firestore的order(by:)方法排序数据了,但可能有些细节没踩对,我来帮你梳理下可能的问题和解决办法:
先确认Firestore里的日期字段类型
很多人会不小心把日期存成字符串(比如"2024-05-20"),但字符串排序是按字符顺序来的,和实际时间顺序可能不符。一定要确保你Firestore里的Date字段是Timestamp类型,这样order(by: "Date")才能按真实时间排序。检查数据模型的字段匹配
你的BreakOuts模型里的日期属性要和Firestore的字段完全一致(包括大小写!),而且类型得是Date,这样Codable才能正确解析:struct BreakOuts: Identifiable, Codable { let id: String // 其他属性... let Date: Date // 注意字段名大小写要和Firestore里的一模一样 }如果字段名不匹配,解析出来的日期可能是默认值,排序自然就失效了。
安全解析数据,避免打乱顺序
原代码里用paper!强制解包很容易崩溃,而且直接append的时候要先清空旧数据,避免重复。另外如果你的ViewModel是ObservableObject,记得用@Published包装papers数组,这样SwiftUI能自动感知数据变化:class YourViewModel: ObservableObject { @Published var papers: [BreakOuts] = [] var errorMessage = "" func fetchTechPapers(_ meet: Meeting){ let uid = meet.uid FirestoreConstants.MeetingsCollection.document(uid).collection("Technical") .order(by: "Date", descending: false) .getDocuments{ documentsSnapshot, error in if let error = error { self.errorMessage = "Failed to fetch papers: \(error)" print("Failed to fetch papers: \(error)") return } // 先清空旧数据,避免重复添加 self.papers.removeAll() documentsSnapshot?.documents.forEach({ snapshot in // 安全解析,避免崩溃 if let paper = try? snapshot.data(as: BreakOuts.self) { self.papers.append(paper) } else { print("Failed to parse a paper from snapshot") } }) } } }别忘了在视图触发数据加载
你原代码里的onAppear是空的!这会导致fetchTechPapers根本没被调用,数据都没加载进来,自然看不到排序效果。一定要在onAppear里调用方法:List{ ForEach(vm.papers) { paper in ZStack{ NavigationLink(value: paper) { EmptyView() }.opacity(0.0) PapersRowView(paper: paper, viewModel: vm) } } } .onAppear(perform: { // 这里要传入你对应的Meeting实例 vm.fetchTechPapers(yourMeetingObject) })
如果还是有问题,你可以打印一下papers数组里的每个Date值,看看是不是正确的;或者打印documentsSnapshot?.documents的顺序,确认Firestore是不是已经返回了排序后的结果,这样就能快速定位问题出在查询还是视图展示环节啦。
备注:内容来源于stack exchange,提问作者johnny

