Reputation: 1191
I have a SwiftUI project and a View that binds to an EnvironmentObject. This object contains a @Published property.
import Foundation
class Global : ObservableObject{
@Published var check :Bool = false;
}
When I run the application and make changes to my property, I see that my view gets redrawn on every change.
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 rates get near 15%, just to draw 20 checkboxes. Is there something I am doing wrong or are there other ways to improve performance? I don't want to use a debounce to resolve this.
Extra information MacOS Catalina 10.15.2 running MacOS SwiftUI project in XCode 11.3
Attached is an Instrument profiling of me clicking and unclicking one of my checkboxes every second. In Instruments I even see CPU run op to 90%.
Upvotes: 4
Views: 1476
Reputation: 202
SwiftUI views get redrawn when @ObservedObject, @EnvironmentObject, @StateObject or @State change. If you use so many toggles that bind to the same property, then you would expect a higher CPU usage. You aren't doing anything wrong and there is no way to improve performance of it for your purpose other than wait for improvements to SwiftUI itself.
Upvotes: 3