首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@ObservedObject更新时SwiftUI列表冻结

@ObservedObject更新时SwiftUI列表冻结
EN

Stack Overflow用户
提问于 2020-02-04 02:30:32
回答 1查看 932关注 0票数 3

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

代码语言:javascript
复制
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)
                            }
                        }
                }
                }
            }
    }
}

模型看起来像:

代码语言:javascript
复制
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会重新计算所有可见视图+上下几个视图的正文。

但我不能确定是什么导致滚动挂起并修复它(也许freeze是一个距离等于(滚动速度*渲染时间)的传输?

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

你能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-18 21:30:51

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60045110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档