SwiftUI Firestore LazyVGrid 导航因更多元素而变慢

SwiftUI Firestore LazyVGrid Navigation Slows with more elements

我的健身应用程序上有一个选项卡,显示我的应用程序上的所有健身教练,这些都是从 firestore 中提取的。我注意到,当网格显示超过 4-5 个培训师时,当我点击培训师(导航 link 到他们的个人资料)时,过渡非常缓慢且缓慢,当我按下培训师个人资料上的后退按钮 return 到所有培训师的网格。

这是我用于显示所有培训师的选项卡的代码:

ScrollView (.vertical, showsIndicators: false, content: {
        
        VStack (alignment: .leading, spacing: 15){
            
            //PAGE TITLE
            HStack {
                Text("Explore creators")
                    .font(.system(size: 22, weight: .semibold))
                    .foregroundColor(.black)
                
                Spacer(minLength: 0)
                
            }
            .padding(.horizontal)

            
            LazyVGrid(columns: items, alignment: .leading, spacing: 12, content: {
                
                //FOR EACH LOOP TO SHOW ALL TRAINERS
                ForEach(topTrainers) { trainer in
                
                    NavigationLink(
                        destination: TrainerView(trainer: trainer, user: user),
                        label: {
                            ExploreGridCell(trainer: trainer)
                        })
                    
                //END OF FOR EACH LOOP
                }
            //END OF LAZYVGRID
            })
            .padding(.top, 6)
            .padding(.horizontal)
            
            
        }
        .padding(.bottom)
        .padding(.top)
        
    })
    .background(Color("fiticBg").ignoresSafeArea())
    .navigationBarTitle("")
    .navigationBarHidden(true)
    .onTapGesture {
        self.hideKeyboard()
    }

这是我关于 lazyVGrid 中训练单元的代码:

ZStack {
        KFImage(URL(string: trainer.trainerImageUrl))
            .loadImmediately()
            .resizable()
            .scaledToFill()
            .frame(width: width, height: 175)
            .clipped()
        
        Rectangle()
            .foregroundColor(.clear)
            .background(LinearGradient(gradient: Gradient(colors: [.clear, .black]), startPoint: .center, endPoint: .bottom))
        
        VStack (alignment: .leading, spacing: 5){
            
            //TRAINER CERTIFICATION BADGE
            if trainer.trainerCertified {
                HStack {
                    
                    ZStack {
                        Color(.white)
                            .frame(width: 15, height: 15)
                        
                        Image(systemName: "checkmark.seal.fill")
                            .font(.title2)
                            .foregroundColor(Color("fiticGreen"))
                    }
                    .clipShape(Circle())
                    
                    
                    Spacer(minLength: 0)
                }
            } else {
                //SHOW NOTHING HERE IF TRAINER IS NOT CERTIFIED
            }
            
            Spacer()
            
            //CONTENT TITLE WITH SPACER FOR SECOND LINE OVERLAP
            HStack {
                Text(trainer.trainerName)
                    .font(.system(size: 16, weight: .bold))
                    .foregroundColor(.white)
                
                Spacer(minLength: 0)
            }
            
        }
        .padding(.horizontal, 10)
        //PUSHES TRAINER NAME UP A BIT
        .padding(.bottom)
        //PUSHES CERTIFICATION BADGE DOWN A BIT
        .padding(.top, 5)
    }
    .cornerRadius(8)
    .shadow(color: Color.black.opacity(0.25), radius: 5, x: 0, y: 5)

从其他堆栈溢出问题中,我看到了有关使用列表而不是滚动视图的事情,但我已经尝试过了,但它不适用于我的视图需要如何设置。

我的代码中是否有任何内容似乎会导致导航 link 的性能如此差和转换缓慢?

您的代码中似乎没有任何内容会导致这种滞后,也许除了为培训师检索图像的时间。从互联网上提取的任何内容都受到真实延迟的影响。解决这个问题的一个方法是从本地提取十几张图像,以确定从本地来源提取图像时延迟是否消失。如果是这样,那么您需要查看 FireStore

因此,从其他建议看来,问题的一部分似乎是从 firestore 加载图像,因为它们是如此之大的文档。所以我压缩了图像,这有点帮助。

然而,最有帮助的是去除训练器单元格的阴影。这似乎是造成最大滞后的原因。