我有一个 SwiftUI 项目和一个绑定(bind)到 EnvironmentObject 的 View 。该对象包含一个@Published 属性。
import Foundation
class Global : ObservableObject{
@Published var check :Bool = false;
}
当我运行应用程序并对我的属性进行更改时,我发现每次更改时我的 View 都会重新绘制。
import SwiftUI
import Combine
struct ContentView: View {
@EnvironmentObject var global :Global
var body: some View {
VStack{
VStack{
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
}
VStack{
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
}
VStack{
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
}
VStack{
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
Toggle("Checked", isOn: $global.check)
}
}
}
}
CPU 使用率接近 15%,只是为了绘制 20 个复选框。是我做错了什么,还是有其他方法可以提高性能?我不想使用去抖来解决这个问题。
额外信息 MacOS Catalina 10.15.2 在 XCode 11.3 中运行 MacOS SwiftUI 项目
附件是我每秒点击和取消点击我的一个复选框的仪器分析。在 Instruments 中,我什至看到 CPU 运行到 90%。
最佳答案
当@ObservedObject、@EnvironmentObject、@StateObject 或@State 改变时,SwiftUI View 会被重绘。如果您使用这么多绑定(bind)到同一属性的切换,那么您会期望更高的 CPU 使用率。你没有做错任何事,除了等待 SwiftUI 本身的改进之外,没有办法为你的目的提高它的性能。
关于performance - SwiftUI ObservableObject CPU 峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59457790/