3

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

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 会重新计算所有可见视图的主体 + 上方和下方的一些视图。

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

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

你能帮助我吗?

4

1 回答 1

2

身体的娱乐应该不是问题。我怀疑性能问题与列表的更新动画有关。

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

于 2020-02-18T13:30:50.907 回答