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