调用 objectWillChange.send() 会产生性能问题

问题描述 投票:0回答:1

我有一个具有嵌套对象结构的项目

Project -> Panels -> Layers

我有 SettingsView,可以在其中更新任何这些结构的不同属性。

每次更新时,我都必须调用

objectWillChange.send()
才能立即查看视图中的更改。 如果我有少量对象,它可以正常工作并且不会产生性能问题。但如果对象数量增加,就会产生性能问题。

我的代码示例如下:

class SelectedProjectHolder: ObservableObject {
    @Published var projects: [Project] = []
    @Published var selectedProject: Project? = nil
.....
    func updateTextLayerColor(for textLayer: TextLayer, newColor: Color) {
        guard let selectedProject = selectedProject else {
            return
        }
        
        for (panelIndex, panel) in selectedProject.panels.enumerated() {
            if let layerIndex = panel.textLayers.firstIndex(where: { $0.id == textLayer.id }) {
                selectedProject.panels[panelIndex].textLayers[layerIndex].color = newColor
                objectWillChange.send()
                return
            }
        }
    }
....
}

struct MainApp: App {
    
    let selectedProjectHolder = SelectedProjectHolder()
var body: some Scene {
        WindowGroup {
            ContentView(lastSaveTime: lastSaveTime)
                .environmentObject(selectedProjectHolder)
        }
        .commands {
            SidebarCommands()
        }
    }
}

我错过了什么以及为什么在不明确调用

objectWillChange.send()
的情况下它不起作用?

有没有一种方法可以立即查看更改,而无需在每次对

objectWillChange.send()
selectedProject
属性进行更改时调用
SelectedProjectHolder

ios swift macos swiftui core-data
1个回答
0
投票

代码结构不正确。该对象应该只保存项目并负责加载和保存。所选项目应在 ProjectsView 中为

@State
。或者在公共父级中声明 @Binding 传递给可以更改选择的子视图,并作为 let 传递给仅读取当前选择的子视图。

© www.soinside.com 2019 - 2024. All rights reserved.