gpt4 book ai didi

swiftui-list - SwiftUI 列表在 @ObservedObject 更新时卡住

转载 作者:行者123 更新时间:2023-12-04 15:35:07 28 4
gpt4 key购买 nike

我有一个列表,它会在接近尾声时自动获取更多数据:

struct AdCardListView: View {
@ObservedObject var model: AdListViewModel = AdListViewModel()

var body: some View {
List { ForEach(self.model.adArray.enumerated().map({ $0 }), id: \.element.id) { index, ad in
AdCardView(ad: ad)
.onAppear {
DispatchQueue.main.async {
let count = self.model.adArray.count
if index >= count - 5 { //5 Views to the end, start loading more.
self.model.fetch(count: count)
}
}
}
}
}
}
}

模型看起来像:
final class AdListViewModel: ObservableObject {
@Published var adArray = [Ad]()
...
func fetch(count: Int = 0) {
...
DispatchQueue.main.async {
self.adArray.append(contentsOf: newAds) //<-- problem here
}
...
}

我的问题:每个 @Published/@ObservedObject 修改我在滚动列表时都有点卡住。另外,我发现 List 重新计算了所有可见 View 的主体 + 上面和下面的一些 View 。

但我无法确定是什么导致滚动挂起并修复它(也许卡住是转移到等于(滚动速度 * 渲染时间)的距离?

为什么 SwiftUI 会在现有 View 上重新计算主体?他们没有改变!

你能帮助我吗?

最佳答案

body 的娱乐应该不是问题。我怀疑性能问题与List的更新动画有关。

您是否尝试添加 .id(UUID())修改器,以便丢弃动画并在更新后重新创建列表。

关于swiftui-list - SwiftUI 列表在 @ObservedObject 更新时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60045110/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com