WJM
WJM

Reputation: 1191

SwiftUI ObservableObject CPU spikes

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%.

enter image description here

Upvotes: 4

Views: 1476

Answers (1)

Danny Richard Aboo
Danny Richard Aboo

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

Related Questions