我有一个小列表,其中包含大约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演示应用程序的布局非常相似>
运行上面的示例代码也存在相同的问题。
我已经在仪器中进行了剖析,大部分时间似乎都在与布局相关的代码中。
我感谢Apple Watch 2现在已经相当老了,但是可以肯定,像上面这样的基本列表应该可以使性能提高。设备上的其他系统应用程序运行良好,尽管不太可能会使用swiftUI。
我应该了解提示或陷阱吗?
我有一个小列表,其中包含大约20个元素。列表中的每一行都是一个简单的自定义视图,在NavigationLink中嵌入了一些标签。 struct RunList:查看{var model:RunModel ...
这可能取决于RunOverview.init
的沉重程度,因为所有这些导航链接视图都是在此ForEach迭代期间构造的(甚至认为尚未激活)>
您可以尝试从DeferView
中尝试this solution,以将实际目标构造推迟到激活相应链接的那一刻
ForEach(model.runs) { run in
NavigationLink(destination: DeferView { RunOverview(run: run) }) {
RunCell(run: run).frame(height: 100)
}
}