文本输入时 SwiftUI 100% CPU + 1 MB 内存

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

TLDR:在表单中聚焦文本字段或文本编辑器时,每次击键都会占用 100% CPU 长达一秒(然后返回到零),并且总内存会增加近 1 MB(并且不会下降)。


详情:

  • XCode 版本 15.1 (15C65)
  • iOS 17.0
  • 斯威夫特5

我正在使用 SwiftUI 和 SwiftData。文本编辑器绑定到 SwiftData 模型上的字段。除此之外,没有什么太疯狂的事情发生,我有一些 onChange 处理程序,但当它们被注释掉时,这种行为仍然存在。

代码是公开的,包含有问题字段的视图位于here。我怀疑它与 SwiftData 有关,但我不知道为什么 - 这种行为似乎是凭空出现的,但坦率地说,我的工作组织得不够好,无法一分为二。

考虑到我的代码的意大利面条性质,我不确定我是否可以将其提取到一个最小的示例中 - 如果任何具有 SwiftData/CoreData 经验的人对我有任何快速提示,我只想让我的应用程序再次可用。

  1. 我从字段中删除了所有 onChange 和 onAppear 处理程序 - 行为仍然存在
  2. 我从有问题的视图中删除了 modelContext,而是在闭包中传递必要的帮助程序 - 行为仍然存在

我已经做了一些其他的事情,但实际上,如果别人告诉我,我会重试任何事情;我对 SwiftUI 的经验不足,无法有效调试。

ios swift swiftui swift-data
1个回答
0
投票

这可能只是您的“意大利面条”问题的部分解决方案:

在还包含层次结构下的

ForEach
TextEditor
视图中,您正在更改
PromptResponse
实例内的数据。不幸的是,当您更改对象时,SwiftUI 无法再识别
self

Identifiable
协议确保集合中的每个对象都是唯一的,这对于 SwiftUI 了解数据更改时要更新哪些视图至关重要。

解决方案:您的类

PromptResponse
已经具有独特的
id
属性,因此符合
Identifiable
很容易:
(Response.swift,第 13 行)

 class PromptResponse: Identifiable {

然后删除

, id: \.self
:
(EntryView.swift,第 27 行)

ForEach(entry.promptResponses.sorted {
                Int($0.order ?? Int.max) < Int($1.order ?? Int.max)
            }) { response in
© www.soinside.com 2019 - 2024. All rights reserved.