在下面的代码中,我将Categories
从CoreData
加载到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 ?? "")
}
}
}
}
}
}
}
1条答案
按热度按时间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