在 int 值之后对 ForEach 中的 FireStore 数据进行排序

Posted

技术标签:

【中文标题】在 int 值之后对 ForEach 中的 FireStore 数据进行排序【英文标题】:Sort FireStore data in ForEach after int value 【发布时间】:2019-12-03 00:24:21 【问题描述】:

我正在构建这个与当地摩托车越野锦标赛相关的应用程序,您可以在其中获得车手的排名。我在 firebase firestore 中有所有车手,我想出了如何在班级中过滤他们,但我想知道如何根据车手在排行榜内的位置(升序)对列表进行排序,以便创建排名。我正在使用一个名为“poz”的 INT 值来确定排行榜中的位置(1 = 1st 等)

您可以在下面找到我的观察者的代码

class clasamentobserver: ObservableObject 

    @Published var riders = [riderData]()

    init() 

        let db = Firestore.firestore()
        db.collection("riders").addSnapshotListener (snap, err) in

            if err != nil
                print((err?.localizedDescription)!)
                return
            

            for i in snap!.documentChanges

                if i.type == .added 

                    let id = i.document.documentID
                    let image = i.document.get("image") as! String
                    let nume = i.document.get("nume") as! String
                    let club = i.document.get("club") as! String
                    let poz = i.document.get("poz") as! Int
                    let mx = i.document.get("mx") as! String


                    self.riders.append(riderData(id: id, image: image, nume: nume, club: club, poz: poz , mx: mx))
                

                if i.type == .removed 

                    let id = i.document.documentID

                    for j in 0..<self.riders.count 

                        if self.riders[j].id == id 
                            self.riders.remove(at: j)
                            return
                        
                    
                

                if i.type == .modified 

                    let id = i.document.documentID
                    let image = i.document.get("image") as! String

                    for j in 0..<self.riders.count 

                        if self.riders[j].id == id 
                            self.riders[j].image = image
                            return

                        
                    
                
            
        
    

在这里你可以找到视图

struct clasamentPage: View 

    @ObservedObject var clasamentObserver = clasamentobserver()
    var body: some View 

        ZStack

            Color("background").edgesIgnoringSafeArea(.all)

            ScrollView 
                GeometryReader  geometry in
                    ZStack 
                        if geometry.frame(in: .global).minY <= 0 
                            Image("t.ciolpani")
                                .resizable()
                                .aspectRatio(contentMode: .fill)
                                .frame(width: geometry.size.width, height: geometry.size.height)
                                .offset(y: geometry.frame(in: .global).minY/9)
                                .clipped()

                            LinearGradient(gradient: Gradient(colors: [Color.gray, Color.clear]), startPoint: .top, endPoint: .bottom)
                                .frame(width: geometry.size.width, height: geometry.size.height)
                                .offset(y: geometry.frame(in: .global).minY/9)
                                .clipped()

                         else 
                            Image("t.ciolpani")
                                .resizable()
                                .aspectRatio(contentMode: .fill)
                                .frame(width: geometry.size.width, height: geometry.size.height + geometry.frame(in: .global).minY)
                                .clipped()
                                .offset(y: -geometry.frame(in: .global).minY)

                            LinearGradient(gradient: Gradient(colors: [Color.gray, Color.clear]), startPoint: .top, endPoint: .bottom)
                                .frame(width: geometry.size.width, height: geometry.size.height + geometry.frame(in: .global).minY)
                                .clipped()
                                .offset(y: -geometry.frame(in: .global).minY)
                        
                    
                .frame(height: 300)

                VStack() 

                    TopPost()

                    if clasamentObserver.riders.isEmpty 

                        Text("No Posts")
                            .fontWeight(.heavy)

                    else 

                        ForEach(clasamentObserver.riders)item in

                                riderCard(image: item.image, nume: item.nume, club: item.club, poz: item.poz)

                        
                    
                
            

        .edgesIgnoringSafeArea(.top)
    

任何提示都会非常有帮助!提前谢谢你!

【问题讨论】:

db.collection("riders").orderBy("poz")...?另请参阅:firebase.google.com/docs/firestore/query-data/order-limit-data 【参考方案1】:

听起来你在找orderBy("poz")

db.collection("riders").orderBy("poz").addSnapshotListener (snap, err) in

我强烈建议您查看 ordering and limiting data 上的 Firebase 文档,了解有关排序工作原理的更多信息,以及有关一般查询的更多信息。

【讨论】:

非常感谢! .order(by: "poz") 做得很好!你是英雄,先生

以上是关于在 int 值之后对 ForEach 中的 FireStore 数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

JS中map()与forEach()的用法

JS中map()与forEach()的区别和用法

使用 FIR 滤波器过滤光谱

基于 State int 的 SwiftUI ForEach

计算中的 Vue forEach

php foreach循环中的变量