【问题标题】:SwiftUI ObservableObject CPU spikesSwiftUI ObservableObject CPU 峰值
【发布时间】:2019-12-23 15:33:15
【问题描述】:

我有一个 SwiftUI 项目和一个绑定到 EnvironmentObject 的视图。此对象包含一个 @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 个复选框。我做错了什么还是有其他方法可以提高性能?我不想使用去抖动来解决这个问题。

额外信息 MacOS Catalina 10.15.2 在 XCode 11.3 中运行 MacOS SwiftUI 项目

附件是我每秒单击和取消单击我的一个复选框的仪器分析。在 Instruments 中,我什至看到 CPU 运行率高达 90%。

【问题讨论】:

  • 我在 iOS 和 macOS 上都没有观察到这一点,最大约为 1%。你是怎么测试的?在什么环境下?请提供更多详细信息。
  • 请查看我的更新。如果你愿意,我也可以与你分享我的测试项目
  • 我使用 Xcode 11.2... 11.3 报告的错误太多,无法迁移。
  • 我尝试了 11.2 并得到了相同的结果。当你快速点击时
  • 我在模拟器和 iPhone 7 上运行过这个。快速切换时,手机上的 CPU 达到 25%。如果我将全局更改为结构和@State,结果相同。我不认为这是不合理的 CPU 使用率。

标签: performance swiftui


【解决方案1】:

当@ObservedObject、@EnvironmentObject、@StateObject 或@State 更改时,SwiftUI 视图会被重绘。如果您使用绑定到同一属性的这么多切换,那么您会期望更高的 CPU 使用率。你没有做错任何事,除了等待 SwiftUI 本身的改进之外,没有办法为你的目的提高它的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多