以下屏幕上的SwiftUI挂起时间为几秒钟.

这段代码是复制粘贴的,它构成了我的简单应用程序的一个标签.第一次显示此选项卡时出现一次挂起.

图像数量约为150;图像大小为1920 x1080.

struct PhotosView : View
{
    @FetchRequest(sortDescriptors: [SortDescriptor(\Photo.date, order: .reverse)], animation: .default)
    private var photos: FetchedResults<Photo>

    @State private var gridHeight = 180.0

    var body: some View
    {
        VStack
        {
            ScrollView(.horizontal)
            {
                LazyHGrid(rows: [GridItem(.fixed(gridHeight))], alignment: .top, spacing: 0)
                {
                    ForEach(photos)
                    { photo in
                        if let data = photo.filteredData
                        {
                            Image(data: data)
                                .resizable()
                                .scaledToFit()
                        }
                    }
                }
                .frame(height: 200)
            }
        }
    }
}

我以为,使用LazyHGrid最初只会加载一小部分(目前屏幕上只有一个半大小).

我如何才能提高性能?

推荐答案

默认情况下,fetch会将每filteredData加载到内存中,即使它没有被显示.您需要使用自定义NSFetchRequest,将includesPropertyValues设置为false,然后创建一个子视图,该子视图接受对象并访问filteredData,从而在出现filteredData时仅为该对象加载(此时将调用body).你还可以从一个搜索非空数据的谓词中受益,这将有助于避免body中的if,这可能会导致速度下降.例如:

struct PhotoView: View {
    @ObservedObject var photo: Photo

    var body: View {
        Image(data: photo.filteredData!)
            .resizable()
            .scaledToFit()
    }
}

// this could be moved to a lazy var in an extension of Photo
let fetchRequest: NSFetchRequest<Photo> = {
    let fr = Photo.fetchRequest()
    fr.predicate = NSPredicate(format: "filteredData != nil")
    fr.includesPropertyValues = false
    fr.sortDescriptors = [NSSortDescriptor(\Photo.date, ascending: false)]
    return fr
}

struct PhotosView : View
{
    @FetchRequest(fetchRequest: fetchRequest, animation: .default)
    private var photos: FetchedResults<Photo>

...
        ForEach(photos) { photo in
            PhotoView(photo: photo)
        }
...

有关更多详细信息,请参阅my answer到另一个问题.

Ios相关问答推荐

自定义alert 未执行任何操作

SwiftUI.从自定义视图修改器访问自定义视图子视图

Xcode15.3上的生成错误:调用的对象类型';facebook::flipper::SocketCertificateProvider';不是函数或函数指针

如何在PINCH上添加UITextfield以zoom 图像

SwiftUI图表-默认情况下,X轴数据点的间距不相等

SWIFT AVFoundation不能在查看更新的同时发布更新

在TVOS中访问SWIFT中的objc++函数时发送给类的无法识别的 Select 符

IOS-获取本地化系统映像

Xcode14 启动时崩溃:dyld:库未加载:/usr/lib/swift/libswiftCoreGraphics.dylib

为 ColorPicker 创建一个名为 Color 的计算变量的绑定

渲染的海边重定向在物理 iOS 设备上不起作用

在 iPad 上删除列表的顶部和底部行

Flutter:无法构建 iOS 应用程序ARCHIVE FAILED,为设备归档时遇到错误

有什么方法可以预填充核心数据?

Swift枚举继承

如何比较两个 UIImage 对象

使用 Chrome DevTools 调试 iOS 6+7 Mobile Safari

swift 语言中的 null / nil

iTunes Connect 中的无限制 Web 访问是什么意思

使用 swift 3 在 UIView 上添加阴影