SwiftUI列出watchOS上带有NavigationLink的性能下降

问题描述 投票:0回答:1

我有一个小列表,其中包含大约20个元素。列表中的每一行都是一个简单的自定义视图,在NavigationLink中嵌入了一些标签。]

struct RunList: View {
    var model: RunModel
    var body: some View {
        List {
            ForEach(model.runs) { run in
//                NavigationLink(destination: RunOverview(run: run)) {. ** seems to have biggest impact on performance. 
                    RunCell(run: run).frame(height: 100)
//                }
            }
        }
        .listStyle(CarouselListStyle())
        .navigationBarTitle(Text("Demo App"))
    }
}

滚动时在Apple Watch上运行此简单列表会占用大量CPU,从而导致其丢帧。

当每个列表项都具有NavigationLink作为根视图时,性能似乎会大大降低。删除导航链接可将CPU使用率降低多达50%,并极大地提高了Apple Watch Series 2的性能,但我们需要将列表行可点击的。

我正在构建的应用程序的布局与Apple https://developer.apple.com/documentation/watchkit/creating_a_watchos_app_with_swiftui生产的PopQuiz演示应用程序的布局非常相似>

运行上面的示例代码也存在相同的问题。

我已经在仪器中进行了剖析,大部分时间似乎都在与布局相关的代码中。

enter image description here

我感谢Apple Watch 2现在已经相当老了,但是可以肯定,像上面这样的基本列表应该可以使性能提高。设备上的其他系统应用程序运行良好,尽管不太可能会使用swiftUI。

我应该了解提示或陷阱吗?

我有一个小列表,其中包含大约20个元素。列表中的每一行都是一个简单的自定义视图,在NavigationLink中嵌入了一些标签。 struct RunList:查看{var model:RunModel ...

ios swift swiftui watchkit
1个回答
0
投票

这可能取决于RunOverview.init的沉重程度,因为所有这些导航链接视图都是在此ForEach迭代期间构造的(甚至认为尚未激活)>

您可以尝试从DeferView中尝试this solution,以将实际目标构造推迟到激活相应链接的那一刻

ForEach(model.runs) { run in
    NavigationLink(destination: DeferView { RunOverview(run: run) }) {
        RunCell(run: run).frame(height: 100)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.