在 SwiftUI 中加载指示器导致无限渲染

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

我有一个在所有视图模型中使用的加载指示器类,我想做的是独立跟踪每个API的加载状态,而不是为整个VM设置一个加载标志。

我有一个超类,它是一个可观察的对象,它具有每个虚拟机所需的所有公共属性,我还有一个 @Obervable (新宏),它是一个加载指示器,如果我不使用组合,视图就会更新一旦一切都按预期工作,但是 UI 不会收到更改通知,因为它是可观察对象内的可观察对象(超类),并且当我添加组合时,它会不断循环。我还尝试将 ObservableObject 类迁移到 Observable,相同的加载指示器类导致无限渲染。

下面是代码

加载指示器

class LoadingIndicatorVM<T: Hashable>: ObservableObject {
@Published var loadingStates: [T: Bool] = [:]
@Published var indicatorId: UUID = UUID()
// Method to update the loading state externally
internal func updateLoadingState(for apiDictionary: T, isLoading: Bool) {
    loadingStates[apiDictionary] = isLoading
}

// Method to retrieve the loading state for a specific API
func isLoading(for apiDictionary: T) -> Bool {
    let currentState = loadingStates[apiDictionary] ?? false
    if !currentState {
        indicatorId = UUID()
    }
    return currentState
}

func isLoading() -> Bool {
     loadingStates.values.contains(true)
}

}

这是超级班

 class ViewModelObject<T: Hashable, DataType>: ObservableObject {
 // props
 var cancellable : AnyCancellable?
 @Published var loading = LoadingIndicatorVM<T>() <-- problem comes from this
 @Published var data: [DataType] = []
 let manager = NetworkManager()
 // rest

}

任何帮助或见解将不胜感激!谢谢你

swiftui
1个回答
0
投票

问题不在于可观察类,我的自定义滚动查看器用于在每个渲染上生成 Id,导致视图无限重新渲染。

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