SwiftUI ObservableObject CPU峰值

时间:2019-12-23 15:33:15

标签: performance swiftui

我有一个SwiftUI项目和一个绑定到EnvironmentObject的View。该对象包含@Published属性。

import Foundation

class Global : ObservableObject{

    @Published var check :Bool = false;

}

当我运行应用程序并对属性进行更改时,我发现每次更改都会重绘视图。

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个复选框即可。我做错了什么吗,还是有其他方法可以提高性能?我不想使用反跳来解决此问题。

其他信息 在XCode 11.3中运行MacOS SwiftUI项目的MacOS Catalina 10.15.2

附件是我每秒对我的一个复选框单击和取消单击的“乐器”配置文件。在Instruments中,我什至看到CPU的运行速度达到90%。

enter image description here

1 个答案:

答案 0 :(得分:2)

当@ ObservedObject,@ EnvironmentObject,@ StateObject或@State更改时,SwiftUI视图将重绘。如果您使用绑定到同一属性的切换开关太多,那么您会期望更高的CPU使用率。您没有做错任何事情,除了等待SwiftUI本身的改进之外,没有其他方法可以提高其性能。