如何在SwiftUI的列表视图中延迟加载CoreData中的对象

x759pob2  于 2023-10-15  发布在  Swift
关注(0)|答案(1)|浏览(100)

在下面的代码中,我将CategoriesCoreData加载到SwiftUI中的List视图中,但由于某种原因,视图在加载时似乎有点慢。什么是延迟加载对象的最佳方式,因为它们显示在屏幕上。换句话说,我如何加快加载时间。如果我将主VStack更改为LazyVStack,它不会显示任何类别。
如何在SwiftUI的列表视图中延迟加载CoreData中的对象?

核心数据实体

类别

属性

产品名称
图片展示

class CategoryServiceModel: ObservableObject{
            
        let manager: CoreDataManager
        
        @Published var categories: [Category] = []  

        init(coreDataManager: CoreDataManager = .instance){
            self.manager = coreDataManager
            loadCategories()
        }

        func loadCategories(){
            let request = NSFetchRequest<Category>(entityName: "Category")

            let sort = NSSortDescriptor(keyPath: \Category.name, ascending: true)
            request.sortDescriptors = [sort]
            do{
                categories =  try manager.context.fetch(request)
                removeDuplicateCategoriesIfNeeded()
            }catch let error{
                print("Error fetching categories. \(error.localizedDescription)")
            }
        }
    }

    struct CategoriesView: View {
        @EnvironmentObject private var categorySM: CategoryServiceModel
        var body: some View {
            NavigationStack {
                VStack{ 
                    List{
                        ForEach(categorySM.categories, id:\.self) { category in
                                let image = UIImage(data: category.image ?? Data())
                                let imageSize: CGFloat = 35
                                HStack{
                                    if let inputImage = UIImage(data: category.image ?? Data()) {
                                        Image(uiImage: inputImage)
                                            .resizable()
                                            .aspectRatio(contentMode: .fit)
                                            .frame(width: imageSize, height: imageSize)
                                            .padding(10)
                                            .clipShape(Circle())
                                            .overlay(Circle().stroke(imageColor, lineWidth: 1))
                                    } 
                                    Text(category.name ?? "")
                                }
                            }
                        }
                    }
                }
            }
    }
efzxgjgh

efzxgjgh1#

List本质上已经很懒惰了。它在iOS 16-17上是一个UI CollectionView,在iOS 15上是一个UI CollectionView。
您不需要List之外的VStack或LazyVStack。当put LazyVStack Package 你的List时,你看不到内容的原因是因为它需要显式指定高度,并建议0作为其子框架的建议高度(VStack进一步建议所有父框架,所以你可以看到所有内容)。所以List认为它位于高度为0的框架内。你可以简单地通过在List中添加带有明确高度的frame修饰符来检查,比如说300。
因此,简而言之,List本身就是一个惰性列表(UICollectionView),不要将其 Package 到任何堆栈中(直到您知道这样做的真实的原因,而在您的示例中并非如此)。
现在,关于核心数据效率的要求。如果你有大量的对象要获取,使用fetchBatchSize,它将帮助你执行有效的请求。https://developer.apple.com/documentation/coredata/nsfetchrequest/1506558-fetchbatchsize

相关问题