我有一个包含16.000个项目的未过滤数据集的列表。 初始加载效果很好,但是过滤=更改列表项非常慢,且耗时超过20秒。
here中描述了该问题:
如果您查看Instruments,它会告诉您几乎所有CPU时间都花在CollectionChanges.formChanges()中。 此方法将对列表的更改(插入,删除)计算出来,以便对其进行动画处理。
因此,以上链接建议在List上设置一个ID,以告知SwiftUI每个更改都代表一个新列表。然后,它不应尝试对更改进行动画处理-因此不要调用CollectionChanges.formChanges()-而是立即绘制列表。
但是上述技巧似乎不再起作用(iOS 13.6和Xcode 11.6),SwiftUI仍会计算更改并将其设置为动画。
因此,有什么方法可以告诉SwiftUI 不对列表进行动画处理吗?
这是上面链接的示例代码:
struct ContentView: View {
@State var items = Array(1...1600)
var body: some View {
VStack {
Button("Shuffle") {
self.items.shuffle()
}
List(items, id: \.self) {
Text("Item \($0)")
}
.id(UUID())
}
}
}
(附带说明:此处建议的解决方法SwiftUI Bug - List changes lock UI - (OLD TITLE: SwiftUI CoreData fetch is very slow)不能显示100毫秒的空列表。)