TLDR:在表单中聚焦文本字段或文本编辑器时,每次击键都会占用 100% CPU 长达一秒(然后返回到零),并且总内存会增加近 1 MB(并且不会下降)。
详情:
我正在使用 SwiftUI 和 SwiftData。文本编辑器绑定到 SwiftData 模型上的字段。除此之外,没有什么太疯狂的事情发生,我有一些 onChange 处理程序,但当它们被注释掉时,这种行为仍然存在。
代码是公开的,包含有问题字段的视图位于here。我怀疑它与 SwiftData 有关,但我不知道为什么 - 这种行为似乎是凭空出现的,但坦率地说,我的工作组织得不够好,无法一分为二。
考虑到我的代码的意大利面条性质,我不确定我是否可以将其提取到一个最小的示例中 - 如果任何具有 SwiftData/CoreData 经验的人对我有任何快速提示,我只想让我的应用程序再次可用。
我已经做了一些其他的事情,但实际上,如果别人告诉我,我会重试任何事情;我对 SwiftUI 的经验不足,无法有效调试。
这可能只是您的“意大利面条”问题的部分解决方案:
在还包含层次结构下的
ForEach
的 TextEditor
视图中,您正在更改 PromptResponse
实例内的数据。不幸的是,当您更改对象时,SwiftUI 无法再识别self
。
Identifiable
协议确保集合中的每个对象都是唯一的,这对于 SwiftUI 了解数据更改时要更新哪些视图至关重要。
解决方案:您的类
PromptResponse
已经具有独特的id
属性,因此符合Identifiable
很容易: class PromptResponse: Identifiable {
然后删除
, id: \.self
:ForEach(entry.promptResponses.sorted {
Int($0.order ?? Int.max) < Int($1.order ?? Int.max)
}) { response in